[XDCTF-2017] destory
分析
本题会对注册表进行修改,请自行nop掉该函数或者放到虚拟机运行
main函数
拿到题目拖进ida,发现main函数无法f5,提示这个地方不是个函数
当手动创建函数时提示 **The function has undefined instruction/data at the specified address. **
这是因为ida无法识别这个函数的开始和结束
这时只需要从main函数开始一直选中到retn,这时这片区域都变成了灰色
按下p后函数便创建成功了,此时main函数内部也从红色变成了黑色。
但是f5的结果却非常的奇怪
到汇编一看,是因为在 0x4015F5 附近加了花指令
手动 undefined 这片区域,再手动 code 后便恢复了正常
f5也可以正常识别
sub_401360
很明显,在这存在花指令,导致ida对其识别有些问题
考虑用 x32dbg随便打开一个程序,将 00401366 到 0040137F 的代码
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 |
复制到其中
当你跟完后(或者可以不用动态调试直接用脑思考)会发现,显然它跳到了 0040137E
也就是说 这个call以及下面的语句,等价于 jmp 0x0040137E ,修改一下即可
类似的花指令的去除将不再阐述。
去除后F5便正常了许多
注: 这一段花指令其实可以不用去除,作为教学内容提一嘴
sub_4013D0
这个函数F5又失败了,ida提示 positive sp value has benn found
这一般是由于堆栈不平衡引起的
发现还是花指令引起的,将这一段变为未定义,手动修复一下堆栈平衡
修复后即可成功F5
最后
逆向后由于flag格式为 XDCTF{ 可以通过如下脚本得到第一个 . 前的数字的前缀为 56451
1 | s = "5D4A4759477D4C6836723437316E3B6E717A787E747F" |
使用下面的代码即可计算出该数字为 56451243
1 | for i in range(0, 10000): |
知道了数字后即可解出flag
1 | s = "5D4A4759477D4C6836723437316E3B6E717A787E747F" |
flag为:XDCTF{He1l020l7klttys}
附录
附件: destory.zip
包含idb文件以及题目