Simple File System

思路

题目给了四个文件,flag,simplefs,image.flag,instruction.txt

打开介绍文件看一下,里面的内容如下

1
2
3
4
5
6
7
8
9
10
11
12
# instructions

I implemented a very simple file system and buried my flag in it.

The image file are initiated as follows:
./simplefs image.flag 500
simplefs> format
simplefs> mount
simplefs> plantflag
simplefs> exit

And you cold run "help" to explore other commands.

从这里面和题目的描述就可以看出这是简单的文件系统,通过挂载然后执行命令。

先执行一遍看看,结果发现plantflag后将flag加密输入到flag文件中,IDA找找加密的地方

在21b2处发现了单字节的加密

3

下面就是依次异或上v4的从小到大BYTE0,BYTE1,BYTE2,HIBYTE,就是相当于每次取v4的两位

现在就需要知道v4的值,这里没有办法直接知道,那就动态调试,在for这里下一个断点

1

这里动态调试遇到一个坑,忘记设置参数,导致每次打开就自动关掉

4

2

运行到这里我们就可以看到ax这是等于

0xDEEDBEEF

因为*CTF{这个开头肯定是不会变得,所以我们利用这个去找对应的加密段

1
2
3
4
5
6
7
8
9
10
11
12
13
a='*CTF{'
for i in a:
x=ord(i)
x = (x >> 1) | (x << 7)&0xff
x ^= 0xef
x = (x >> 2) | (x << 6)&0xff
x ^= 0xbe
x = (x >> 3) | (32 * x)&0xff
x ^= 0xed
x = (x >> 4) | (16 * x)&0xff
x ^= 0xde
x = (x >> 5) | (8 * x)&0xff
print(hex(x))

解出来是0x0,0xd2,0xfc,0xd8,0xa2 我们就可以去image.flag里面去找

5

EXP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
flag=''
a=[0x00, 0xD2, 0xFC, 0xD8, 0xA2, 0xDA, 0xBA, 0x9E, 0x9C, 0x26, 0xF8, 0xF6, 0xB4, 0xCE,
0x3C, 0xCC,0x96, 0x88, 0x98, 0x34, 0x82, 0xDE, 0x80, 0x36, 0x8A, 0xD8, 0xC0, 0xF0, 0x38, 0xAE,
0x40]
for j in range(32):
for i in range(32,128):
x = i
x = (x >> 1) | (x << 7)&0xff
x ^= 0xef
x = (x >> 2) | (x << 6)&0xff
x ^= 0xbe
x = (x >> 3) | (32 * x)&0xff
x ^= 0xed
x = (x >> 4) | (16 * x)&0xff
x ^= 0xde
x = (x >> 5) | (8 * x)&0xff
if(x==a[j]):
flag+=chr(i)
print(flag)
#*CTF{Gwed9VQpM4Lanf0kEj1oFJR6}