-
-
[原创]*CTF Simple File System
-
发表于: 2022-4-21 20:45 4593
-
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处发现了单字节的加密
下面就是依次异或上v4的从小到大BYTE0,BYTE1,BYTE2,HIBYTE,就是相当于每次取v4的两位
现在就需要知道v4的值,这里没有办法直接知道,那就动态调试,在for这里下一个断点
这里动态调试遇到一个坑,忘记设置参数,导致每次打开就自动关掉
输入命令
format
mount
plantflag
运行到这里我们就可以看到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里面去找
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} |
赞赏
看原图
赞赏
雪币:
留言: