RE套路 - 关于逆向常客花指令

此文用来整理和分析做题过程中所遇到的那些花指令,必然持续更新。

关于花指令的介绍见:花指令 · 逆向工程入门指南,这里只总结例子啦~

call $+x模式

[2021 ISCC] 擂台题-ZCM

1
2
3
4
5
6
7
...:00815023 038 E8 00 00 00 00          call    $+5
...:00815028 03C 55 push ebp
...:00815029 040 8B EC mov ebp, esp
...:0081502B db 36h
...:0081502B 040 36 83 45 04 0A add dword ptr [ebp+4], 0Ah
...:00815030 040 5D pop ebp
...:00815031 03C C3 retn

这一段可以完全等同于等同长度字节的nop,但是却能干扰IDA的反编译器。

首先我们知道:

1
2
call addr ;将返回地址(即call的下一条指令首地址)压入栈中,等同于push $+5;mov ip,addr
ret ;将栈顶地址作为返回地址进行跳转,等同于pop ip

那么执行完前三条指令(到0x0081502B时)栈区分布大概是:

在本例中,ret_addr=0x00815028,而add dword ptr [ebp+4], 0Ah根据栈区分布可以很明显地知道[ebp+4]就是ret_addr,所以是ret_addr+=0x0Aret_addr=0x00815032

0x00815032这个返回地址正是ret指令的下一条指令,也就是说这一整段0x00815023-0x00815031代码是完全无意义的,甚至没有破坏寄存器值,所以可以完全用相同长度的nop指令代替。

[划重点] 去花方法:等同于相同长度的nop指令。

文章作者: c10udlnk
文章链接: https://c10udlnk.top/p/reSkillsOn-ALLaboutJunkCode/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 c10udlnk_Log