[XDCTF-2017] destory

分析

本题会对注册表进行修改,请自行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 的代码

1
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

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

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

1
2
3
4
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

1
2
3
4
5
6
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文件以及题目