number_game
这道题是一道二叉树遍历的逆向,数据结构刚学完2个月,看的时候完全没想起来树的相关知识,搁那跟踪递归,头都快跟晕了。还有一些动调的问题,一并在这里记一下。
首先,文件无壳,64位elf,ida打开
1 | unsigned __int64 __fastcall main(__int64 a1, char **a2, char **a3) |
先看看先序遍历sub_400758
1 | _QWORD *__fastcall sub_400758(__int64 a1, int a2, int a3) |
画个图吧,以输入序列:0123456789来看
先序遍历赋值完后v3就是上面这棵树
然后sub_400807就是将中序遍历v3的结果赋给v7,具体代码如下:
1 | __int64 __fastcall sub_400807(__int64 a1, __int64 a2) |
中序遍历的结果就是7,3,8,1,9,4,0,5,2,6
解题脚本:
1 | text = [0x31, 0x34, 0x23, 0x32, 0x33, 0x33, 0x30, 0x23, 0x31, 0x23, |
flag{1134240024}
动调
一开始开动调一步一步跟着递归,实在是有点费脑子,后来就想着干脆直接绕过输入合理性检测,输入个0123456789
看最终的v7序列得了,
便做了以下尝试
patch完后发现动调始终达不到目的,依旧会进入checkenable,输入不合理的时候依然会给 eax 赋0,不知道咋回事,害
后来看别的师傅的wp的时候发现ida还可以在调试状态下动态修改标志寄存器。。(不好意思,wtcl)
这样的话,就在会检测到不合理的地方下断点
每次跳转前修改一下ZF让他不跳转,然后往下执行,就可以得到想要的v7了!
Comments