April 18, 2022

STARCTF2022-Simple File System

好吧,全部都是ELF文件,但依然想

0x00 日常查壳

给了三个文件,如题名一样,简单的文件系统,不过主逻辑在这个文件

image-20220418192736295

0x01 分析simlefs

浏览了一遍主函数无疑我们关心的是plantflag

随机数出来的v21和v22我们无法逆,不过关键点就是在参数1的那次进去

image-20220418193323238

注意在这打开了我们的flag文件,然后进入了关键的函数,像参数为2调用了rand根本没法逆

image-20220418193926873

观看这个Encode函数完全可逆,v4动调即得,密文通过观察image.flag获得(毕竟在这个文件找不到

image-20220418193939286

0x02 GetData!

设置好参数,起飞(开调

image-20220418194139609

输入好参数

image-20220418194524815

动调可以直接拿到v4的值和加密后的*CTF{后的值,于是我们可以通过这个值去找密文

image-20220418195115666

即可得到

image-20220418195214843

0x03 GetFlag!

拿这个密文直接解密即可得到flag

也可以观察整个文件发现有多出密文,从0x33000开始,每隔0x1000就会有一段密文,读取解密也可

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
def Decrypt(encFLag):
flag = ""
for i in range(len(encFLag)):
v5 = encFLag[i]
v5 = (v5 >> 3) | (v5 << 5) & 0xFF
v5 ^= 0xDE
v5 = (v5 >> 4) | (v5 << 4) & 0xFF
v5 ^= 0xED
v5 = (v5 >> 5) | (v5 << 3) & 0xFF
v5 ^= 0xBE;
v5 = (v5 >> 6) | (v5 << 2) & 0xFF
v5 ^= 0xEF;
v5 = (v5 >> 7) | (v5 << 1) & 0xFF
flag += chr(v5)
return flag


data = open('C:\\Users\\Pz\\Desktop\\STARCTF\\Simple File System\\image.flag', 'rb').read()
encFlags = [list(data[0x33000 + i * 0x1000: 0x33000 + i * 0x1000 + 32]) for i in range(200)]

for flag in encFlags:
p = Decrypt(flag)
if "*CTF" in p:
print(flag)
print(p)
break

# encFlags = open('C:\\Users\\Pz\\Desktop\\STARCTF\\Simple File System\\encFlag.flag', 'rb').read()
# print(Decrypt(encFlags))

GetFlag!

image-20220418195454640

DASCTF X SU
🍬
HFCTF2022
🍪

About this Post

This post is written by P.Z, licensed under CC BY-NC 4.0.