ESP定理手动脱壳

ESP定律是什么?

写在前面:本人还是一个正在摸索的小白,可能会有说错的地方,请大家多加指点!本人这篇文章可以让大家了解如何快速的过掉简单的壳,并没有讲解壳的执行流程等知识。

使用ESP定律脱壳之前  ,我们要先知道什么是ESP定律,ESP是汇编中的栈顶寄存器,存放着栈顶的地址,栈顶和栈底有一个特性,那就是堆栈平衡,尤其是在调用函数的时候表示的尤为明显。

在调用函数之后我们会先保留当前的栈顶和栈顶 ,然后创建的新的栈空间也就是栈顶栈底重新划分,然后会将一些寄存器的值存入栈中,先将自身的数据保存,之后就是将创建的新的堆栈空间初始化,去除垃圾数据,再进行这个程序的执行,执行完后,将保存的寄存器的值出栈,再恢复栈顶栈底,然后返回到调用函数的指令的下一条指令。

而一个壳也可以看成调用了一段程序,所以他也遵守着堆栈平衡的规定,这样我们将ESP的值下上断点,在一条指令执行后可以得到相同的ESP值的时候也代表着壳已经进入了结束的地方!

这样我们就知道了ESP定律的知识

更详细的在这里 :

ESP定律脱壳详解_esp定律脱壳原理-CSDN博客

这样我们就知道了抓住堆栈平衡这一关键点就可以找到flag了!

使用ESP定律脱壳

2022DASCTF easyre

先查壳

发现有ASPack壳

用od打开

可以看到我们的程序断在了一个关键的指令

pushad指令 就是将寄存器的值压入栈中   这就对应我们说的保留寄存器的值

执行到下一条指令

对这个值下硬件断点

右键选择 跟随到数据窗口

然后按F9执行

可以看到我们来到了popad下一条下面(popad是将寄存器的值返回)

我们按F8执行到ret下面一条指令

这个SUB ESP,0C  是调用函数之后恢复堆栈的指令。

按回车键进去看看

调用了几个关键的函数  可以判断这就是OEP

回到call那条指令开始脱壳

脱完之后拖入DIE还是会显示有壳(这是为什么?)

拖入ida

这里不知道为什么也显示 sp-analysis failed

但是对我们分析main函数没有影响

本篇文章只针对脱壳,就不分析代码了-^_^-

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值