ESP定律脱壳
接触的少被面试官叼了😭复习复习
原理
ESP定律的原理在于利用程序中堆栈平衡来快速找到OEP。
由于在程序自解密或者自解压过程中, 不少壳会先将当前寄存器状态压栈, 如使用pushad
, 在解压结束后, 会将之前的寄存器值出栈, 如使用popad
. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发. 然后在程序当前位置, 只需要少许单步操作, 就很容易到达正确的OEP位置。
- 程序刚载入开始
pushad/pushfd
- 将全部寄存器压栈后就设对ESP寄存器设硬件断点
- 运行程序, 触发断点
- 删除硬件断点开始分析
步骤
文件地址:2_esp.zip
脱壳步骤
入口为popad
, 按下F8执行,popad
保存寄存器状态, 可以在右边的寄存器窗口里发现ESP
寄存器的值变为了红色, 即值发生了改变。
右键选择断点HW break[ESP]
按 F9 执行,直到停止,此时跳转到004010CC
执行到该地址返回之后看到ollydbg错误解析成了数据,右键选择从模块中删除分析
得到分析后的结果
重构IAT
右键对上述代码选择用OllyDump脱壳调试进程
,确认起始地址和OEP地址,并取消重建输入表
此时不要关闭ollydbg,打开ImportREC,选择正在调试的进程,OEP设置为上述10CC
,选择 IAT AutoSearch
,出现下面提示后选择Get Imports
,
确定无误后选择Fix Dump
,选择使用ollydbg导出的文件fix.exe
,修复完毕后会产生一个修复完成的fix_.exe
正常打开