Bbbbbbbbbabyre
摸鱼文重写了。
一、无法反汇编怎么办
本题的主函数在不经过处理的情况下没有办法反汇编,解决途径有二:
1. 将函数体选中,直接转化为函数
2. 在函数体最后sp堆栈不平衡的位置把多余的代码行去掉
这种情况基本是函数内部的函数调用有问题, 某个函数的函数声明有问题. 此时选项->general->disassembly->Display disassembly line parts->stack pointer前的勾打上, 就可以看到IDA view窗口前面多出000, 004, -004之类的. 这就是堆栈变化数字, 选中某一行, 按alt+k就可以调整堆栈变化. 去找有问题的函数, 或者粗暴地把末尾的正数改成负数, 按F5就行了. 不过详细分析的时候应该找找哪个函数的声明弄错了, 然后按Y改下就行了 ## 二、题目重点
每轮一个操作数,存入三个数据进行操作
注意操作数有两个%64,对这个数据对应位置查看可以发现,其实是从0到41均操作了两遍,但如果没有意识到的话,会发现这个数据是没有规律的(即,注意使用传入的数据分析,而非原始数据自身)
分析操作数(按先后顺序)p1,p2,可以发现是将p1是三元组的第一个数,p2的(b是对应的byte)b0,b2为同一个三元组的第二个数,b1为同一个三元组的第三个数
对每一步switch进行分析,发现:
case 0:更新p2的b0为b0指向的字符 case 1:更新p2的b0与b1为其对应指向的字符 case 2:将b1与b0进行异或 case 3: 将b1与b0进行求与赋给d,以及时钟判断debug case 4:将b1乘2,b3=b1 case 5:将d赋值b0 case 6:case5,寄存更新b2(b1)位置对应的字符 case 7:切换下一轮 case 8:(异常)退出 case 9: (正经)退出
分析switch的生成逻辑知,如果p1为999直接终极退出(见上);否则,如果有b3,每次取p1的下一个lowbit位,为下一个操作数;如果到6且b3不为零就返回2;否则,如果b3为0,就到7。
再分析每次的三元组,通过动态调试发现,第一个三元组负责提供操作数据,第二个负责赋值,所以取出这些数,进行逆向操作。
三、逆向代码
1 |
|
备注:注意有求与求或的无法逆向,只能暴力破拆,而且要逆向运算,但是在re里,输入的都是可见字符,所以范围可以小一点。
Enter text in Markdown. Use the toolbar above, or click the ? button for formatting help.