ESP定律是什么?
写在前面:本人还是一个正在摸索的小白,可能会有说错的地方,请大家多加指点!本人这篇文章可以让大家了解如何快速的过掉简单的壳,并没有讲解壳的执行流程等知识。
使用ESP定律脱壳之前 ,我们要先知道什么是ESP定律,ESP是汇编中的栈顶寄存器,存放着栈顶的地址,栈顶和栈底有一个特性,那就是堆栈平衡,尤其是在调用函数的时候表示的尤为明显。
在调用函数之后我们会先保留当前的栈顶和栈顶 ,然后创建的新的栈空间也就是栈顶栈底重新划分,然后会将一些寄存器的值存入栈中,先将自身的数据保存,之后就是将创建的新的堆栈空间初始化,去除垃圾数据,再进行这个程序的执行,执行完后,将保存的寄存器的值出栈,再恢复栈顶栈底,然后返回到调用函数的指令的下一条指令。
而一个壳也可以看成调用了一段程序,所以他也遵守着堆栈平衡的规定,这样我们将ESP的值下上断点,在一条指令执行后可以得到相同的ESP值的时候也代表着壳已经进入了结束的地方!
这样我们就知道了ESP定律的知识
更详细的在这里 :
这样我们就知道了抓住堆栈平衡这一关键点就可以找到flag了!
使用ESP定律脱壳
2022DASCTF easyre
先查壳
发现有ASPack壳
用od打开
可以看到我们的程序断在了一个关键的指令
pushad指令 就是将寄存器的值压入栈中 这就对应我们说的保留寄存器的值
执行到下一条指令
对这个值下硬件断点
右键选择 跟随到数据窗口
然后按F9执行
可以看到我们来到了popad下一条下面(popad是将寄存器的值返回)
我们按F8执行到ret下面一条指令
这个SUB ESP,0C 是调用函数之后恢复堆栈的指令。
按回车键进去看看
调用了几个关键的函数 可以判断这就是OEP
回到call那条指令开始脱壳
脱完之后拖入DIE还是会显示有壳(这是为什么?)
拖入ida
这里不知道为什么也显示 sp-analysis failed
但是对我们分析main函数没有影响
本篇文章只针对脱壳,就不分析代码了-^_^-