ESP定律脱壳

接触的少被面试官叼了😭复习复习

原理

ESP定律的原理在于利用程序中堆栈平衡来快速找到OEP。

由于在程序自解密或者自解压过程中, 不少壳会先将当前寄存器状态压栈, 如使用pushad, 在解压结束后, 会将之前的寄存器值出栈, 如使用popad. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发. 然后在程序当前位置, 只需要少许单步操作, 就很容易到达正确的OEP位置。

  1. 程序刚载入开始 pushad/pushfd
  2. 将全部寄存器压栈后就设对ESP寄存器设硬件断点
  3. 运行程序, 触发断点
  4. 删除硬件断点开始分析

步骤

文件地址:2_esp.zip

脱壳步骤

入口为popad, 按下F8执行,popad保存寄存器状态, 可以在右边的寄存器窗口里发现ESP寄存器的值变为了红色, 即值发生了改变。

No-466-image右键选择断点HW break[ESP]

No-554-image

按 F9 执行,直到停止,此时跳转到004010CC

No-647-image

执行到该地址返回之后看到ollydbg错误解析成了数据,右键选择从模块中删除分析

No-756-image

得到分析后的结果

No-831-image

重构IAT

右键对上述代码选择用OllyDump脱壳调试进程,确认起始地址和OEP地址,并取消重建输入表

No-956-image

此时不要关闭ollydbg,打开ImportREC,选择正在调试的进程,OEP设置为上述10CC,选择 IAT AutoSearch,出现下面提示后选择Get Imports

No-1117-image

确定无误后选择Fix Dump,选择使用ollydbg导出的文件fix.exe,修复完毕后会产生一个修复完成的fix_.exe正常打开

No-1257-image

参考

posted @ 2024-09-03 17:12  JICEY  阅读(53)  评论(0编辑  收藏  举报