NPCCTF wp

week1

web

1.play a game

image-20250219203350915

可以看到,打开题目就是一个2048的小游戏,要是闲着无聊的话可以先玩一玩(bushi

左看看右看看没有什么线索,打开F12看看元素,欸,看到了这个

image-20250219203802031

于是我们访问/check.php.image-20250219203846596

有个这个,于是我们输入分数,先往大量输入image-20250219204211136

欸,不行,然后我就去搜了一下2048这个游戏的理论最大值和最小值,啧,都不行。试了很多遍,最后快不想做的时候,摆烂输了个114514……就这么成了。image-20250219204444277

然后我才发现”MTEONTEO”是114514的base64编码。。我还以为是出题人姓名。

有了明文php后就好做了,这个if条件里面是或,只用满足一个就好了,所以不用数组绕过之类的东西。

下面的eval($func.$arg);直接func传入函数,arg传入命令就好了,所以payload是

?score=114514&func=system&arg=("cat /flag");

image-20250219205020372

得到flag。

misc

1.r!g!b!

把附件下载下来可以看到有两个文件,一张是bmp图片,一个是exe运行文件,题目提示只能发图片,不能发文件,所以有了一个编码工具,这就是在提示要把bmp图片放到编码工具一下。

image-20250221161220489

image-20250221161313729

多出来一个新图片,把这张图放binwalk里检测提取一下

image-20250221161838037

可以看到提取出来一个文件夹,里面有着两个文件flag.docx、768.zip。image-20250221162100558

要打开768.zip的时候提示压缩包出错,重点应该不是这个而是flag.docx,但是打不开这个文件。

放010中分析了一下发现这是有一个压缩包,改一下后缀名成flag.zip

正常情况下仍然无法打开,但用7-zip可以image-20250221162616368

可以看到里面有这些文件。

进入word文件夹里,打开那个document.xml

image-20250221162806166

flag就这么出来了image-20250221162843209

flag{17f8c2dea9b8aae825b25b406a071c43}

Crypto

1.river

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class LFSRStreamCipher:
def __init__(self, key: int):
if not (0 <= key < 2**16):
raise ValueError("Key must be a 16-bit integer")
self.state = key
self.poly = 0b1010000000000101 # 反馈多项式: x^16 + x^14 + x^13 + x^11 + 1

def lfsr_step(self) -> int:
feedback = self.state & 1
self.state >>= 1
if feedback:
self.state ^= self.poly
return feedback

def generate_keystream(self, length: int) -> bytes:
keystream = bytearray()
for _ in range(length):
byte = 0
for i in range(8):
byte |= self.lfsr_step() << i
keystream.append(byte)
return bytes(keystream)

def encrypt(self, plaintext: bytes) -> bytes:
"""使用密钥流加密"""
keystream = self.generate_keystream(len(plaintext))
return bytes(p ^ k for p, k in zip(plaintext, keystream))

def decrypt(self, ciphertext: bytes) -> bytes:
"""使用密钥流解密(加密与解密是相同的)"""
return self.encrypt(ciphertext)


# 密钥
key = 0b1101011010110101
cipher = LFSRStreamCipher(key)

# 密文
ciphertext = bytes.fromhex("bd8b802f4a05ed77abace36b6cf9adbe627d3632edff818c556120ad131b50dbedd0f4af4483")

# 解密
plaintext = cipher.decrypt(ciphertext)

# 输出解密后的明文
print("Decrypted plaintext:", plaintext.decode())

解出flag为flag{two_dift3rs_0ff_t0_s33_th3_w0rld}

week2

web

1.file_manager

image-20250227200345404

题目打开一看就是一个文件上传,但实际上并不是一个文件上传题目。

题目有提示image-20250227200444949

这就是在暗示我们可能要上传压缩包,等到后来,确实,上传正常的文件根本看不到image-20250227200613935

于是开始上传压缩包,开始以为是文件上传的题目,于是上传一句话木马image-20250227200741774

但点击之后是直接将文件下载下来,没有办法利用image-20250227200853864

于是我们换个思路,既然我们已知flag的位置,又可以直接点击文件,不如创建一个软链接,可以直接把flag.txt文件内容下载下来,所以我们创建软链接

1
ln -s /flag.txt 1

因为要上传压缩包,所以要把这个软链接压缩一下,另外要注意软链接压缩要加--symlink选项,不然上传的链接没有用

1
zip --symlink 1.zip 1

将1.zip上传image-20250227201626029

image-20250227201638716

好的,上传后点击下载,flag就在里面了。

image-20250227201744000

获得flagflag{Th1s_1s_Y0ur_Fl4g}


NPCCTF wp
http://example.com/2025/02/19/NPCCTF-wp/
作者
yuhua
发布于
2025年2月19日
许可协议