[XDCTF-2017] destory

Posted    on 2017, Oct6, Friday 04:21:20
Modified on 2017, Oct6, Friday 04:21:20

分析

最开始的话

本题会对注册表进行修改,请自行nop掉该函数或者放到虚拟机运行

main函数

拿到题目拖进ida,发现main函数无法f5,提示这个地方不是个函数

不是函数

当手动创建函数时提示 *The function has undefined instruction/data at the specified address. *

创建失败

这是因为ida无法识别这个函数的开始和结束

这时只需要从main函数开始一直选中到retn,这时这片区域都变成了灰色

灰色

按下p后函数便创建成功了,此时main函数内部也从红色变成了黑色。

但是f5的结果却非常的奇怪

F5

到汇编一看,是因为在 0x4015F5 附近加了花指令

0x4015F5

手动 undefined 这片区域,再手动 code 后便恢复了正常

asm

f5也可以正常识别

F5

sub_401360

很明显,在这存在花指令,导致ida对其识别有些问题

花指令

考虑用 x32dbg随便打开一个程序,将 004013660040137F 的代码

E8 04 00 00 00 51 16 EB 0F 58 EB 03 5B 89 33 83 C0 02 EB 01 91 50 C3 38 74 03

复制到其中

x32dbg

当你跟完后(或者可以不用动态调试直接用脑思考)会发现,显然它跳到了 0040137E

也就是说 这个call以及下面的语句,等价于 jmp 0x0040137E ,修改一下即可

类似的花指令的去除将不再阐述。

去除后F5便正常了许多

F5

注: 这一段花指令其实可以不用去除,作为教学内容提一嘴

sub_4013D0

这个函数F5又失败了,ida提示 positive sp value has benn found

这一般是由于堆栈不平衡引起的

发现还是花指令引起的,将这一段变为未定义,手动修复一下堆栈平衡

花

修复后即可成功F5

最后

逆向后由于flag格式为 XDCTF{ 可以通过如下脚本得到第一个 . 前的数字的前缀为 56451

s = "5D4A4759477D4C6836723437316E3B6E717A787E747F"
xdctf='XDCTF{'
for i in range(len(xdctf)):
    print(int(s[i*2:i*2 + 2], 16) - ord(xdctf[i]))

使用下面的代码即可计算出该数字为 56451243

for i in range(0, 10000):
    a2 = int('56451' + str(i))
    if a2 % 5 == 3 and a2 % 7 == 2 and a2 % 13 == 4:
        print(a2)

知道了数字后即可解出flag

s = "5D4A4759477D4C6836723437316E3B6E717A787E747F"
s1 = '56451243'
flag = ''
for i in range(len(s)//2):
    flag += chr(int(s[i*2:i*2 + 2], 16) - ord(s1[i % len(s1)]) + ord('0'))

flag为:XDCTF{He1l020l7klttys}

附录

附件: destory.zip

包含idb文件以及题目