Update
chore: add 计算机安全
This commit is contained in:
@@ -26,28 +26,28 @@ upx -d 文件名
|
||||
|
||||
### ESP 定律脱壳法(本节来源于 ctf-wiki:[https://ctf-wiki.org/reverse/windows/unpack/esp/](https://ctf-wiki.org/reverse/windows/unpack/esp/))
|
||||
|
||||
ESP 定律法是脱壳的利器, 是应用频率最高的脱壳方法之一.
|
||||
ESP 定律法是脱壳的利器,是应用频率最高的脱壳方法之一。
|
||||
|
||||
#### 要点
|
||||
|
||||
ESP 定律的原理在于利用程序中堆栈平衡来快速找到 OEP.
|
||||
|
||||
由于在程序自解密或者自解压过程中, 不少壳会先将当前寄存器状态压栈, 如使用 `pushad`, 在解压结束后, 会将之前的寄存器值出栈, 如使用 `popad`. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发. 然后在程序当前位置, 只需要少许单步操作, 就很容易到达正确的 OEP 位置.
|
||||
由于在程序自解密或者自解压过程中,不少壳会先将当前寄存器状态压栈,如使用 `pushad`, 在解压结束后,会将之前的寄存器值出栈,如使用 `popad`. 因此在寄存器出栈时,往往程序代码被恢复,此时硬件断点触发。然后在程序当前位置,只需要少许单步操作,就很容易到达正确的 OEP 位置。
|
||||
|
||||
1. 程序刚载入开始 pushad/pushfd
|
||||
2. 将全部寄存器压栈后就设对 ESP 寄存器设硬件断点
|
||||
3. 运行程序, 触发断点
|
||||
3. 运行程序,触发断点
|
||||
4. 删除硬件断点开始分析
|
||||
|
||||
#### 示例
|
||||
|
||||
示例程序可以点击此处下载: [2_esp.zip](https://github.com/ctf-wiki/ctf-challenges/blob/master/reverse/unpack/2_esp.zip)
|
||||
示例程序可以点击此处下载:[2_esp.zip](https://github.com/ctf-wiki/ctf-challenges/blob/master/reverse/unpack/2_esp.zip)
|
||||
|
||||
还是上一篇的示例, 入口一句 `pushad`, 我们按下 F8 执行 `pushad` 保存寄存器状态, 我们可以在右边的寄存器窗口里发现 `ESP` 寄存器的值变为了红色, 也即值发生了改变.
|
||||
还是上一篇的示例,入口一句 `pushad`, 我们按下 F8 执行 `pushad` 保存寄存器状态,我们可以在右边的寄存器窗口里发现 `ESP` 寄存器的值变为了红色,也即值发生了改变。
|
||||
|
||||

|
||||
|
||||
我们鼠标右击 `ESP` 寄存器的值, 也就是图中的 `0019FF64`, 选择 `HW break[ESP]` 后, 按下 `F9` 运行程序, 程序会在触发断点时断下. 如图来到了 `0040D3B0` 的位置. 这里就是上一篇我们单步跟踪时到达的位置, 剩余的就不再赘述.
|
||||
我们鼠标右击 `ESP` 寄存器的值,也就是图中的 `0019FF64`, 选择 `HW break[ESP]` 后,按下 `F9` 运行程序,程序会在触发断点时断下。如图来到了 `0040D3B0` 的位置。这里就是上一篇我们单步跟踪时到达的位置,剩余的就不再赘述。
|
||||
|
||||
## 软件加密常用算法
|
||||
|
||||
|
||||
Reference in New Issue
Block a user