Fork me on GitHub

2019看雪CTF-Q1-第六题 Repwn详解

这题花了我今天所有的空闲时间(大概五个多小时),所以有必要记录一下自己的解题过程:-)

题目和脚本

0x01 第一关(re+pwn???)

第一个关键函数sub_4014C0伪代码如下

1

首先输入key,进入第一个校验函数sub_4012F0,如下图

2

可以看到是进行明文比较a1[8:20]是否等于X1Y0uN3tG00d,这里的a1即输入的key;并且校验a1[20]是否等于H

接下来进入函数sub_401460,如下图。

该函数给出了key的长度为24,然后通过函数sub_4013B0校验key的前8个字节,前8个字节的校验比较简单,用z3跑一发即可,这里不再赘述。

z3脚本地址

(比较坑的是题目并没有说key的前八位只能是数字,错了好多次直到问了出题人才知道这题居然还有”标准“答案。。。)

综上我们得到key[0:21] = "20101001X1Y0uN3tG00dH"

接着非常奇怪的是key 的最后四个字节仅进行了减操作,然后对key进行了复制,至此key 的校验结束。

于是用Olldbg动态调试一下,在输入处下断点,F9执行至返回(停在断点),直到运行至0x40149C,如下图。

往后运行一下发现这里还有个jmp指令,继续跟,发现程序崩了,并且错误提示如下。

我的输入是20101001X1Y0uN3tG00dH123,而H123的十六进制为0x48313233,各个字节经过函数sub_401460里的减操作之后得到的就是0xF0EB2FC8。也就是说我输入的最后四个字节经过减操作之后被当成地址进行跳转。

问题是应该跳到哪里去呢?可以确定的是这个地址的最后两位一定是F0,并且地址的前四位一定是0040,以此可以知道key[22:23] = "Ck",那么就差key[21]了。

然后我就去IDA疯狂翻地址末尾为F0的函数,然后啥都没翻到。

最后无意中看到0x00401BF0处的汇编十分可疑,但是此处并没有识别为函数。IDA里右键选择create function 即可。

chr(0x46+0x1b) = 'a' ,即key就是20101001X1Y0uN3tG00dHaCk

0x02 第二关(re)

这个加密算法我看了一两个小时。。。

最后通过一些特征数据查到这是DES加密。。。

需要注意的是,这里的一大堆赋值跟v12并没有半毛钱关系。。v12的值在0x0040740C处。

Dst是通过密文(64位)每4位一组得到的16个十进制数,这里我一开始看岔了。。绕了好久。

综上,DES加密,密钥为XiyouNet,密文为0x9db084ac97041e30,python解一发。

1
2
3
4
5
6
>>> from Crypto.Cipher import DES
>>> key = 'XiyouNet'
>>> des = DES.new(key, DES.MODE_ECB)
>>> des.decrypt("\x9d\xb0\x84\xac\x97\x04\x1e0")
'Wel1C0me'
>>>