利用ESP定律的upx脱壳实践

利用ESP定律的upx脱壳实践利用ESP定律的upx脱壳实践背景:除了命令行upx-d脱壳,还有手动脱壳。ESP定律的本质是堆栈平衡,又称堆栈平衡定律,是应用频率最高的脱壳方法之一,脱壳的目的就是找到真正的OEP(源文件的EP代码)方法:从pushad到popad是一段解压缩代码(解压UPX壳),这段代码执行后,紧跟在popad后的第一个JMP指令可跳转到OEP实践:1:查壳2:OD打开3:F8//对于寄存器,指令执行后发生改变的寄存器会用红色显示.此处ESP和EIP的值发生改变,因为执行pushad指令,将8个

大家好,又见面了,我是你们的朋友全栈君。

背景:
除了命令行upx -d脱壳,还有手动脱壳。ESP定律的本质是堆栈平衡,又称堆栈平衡定律,是应用频率最高的脱壳方法之一,脱壳的目的就是找到真正的OEP(源文件的EP代码)

方法:
从pushad到popad是一段解压缩代码(解压UPX壳),这段代码执行后,紧跟在popad后的第一个JMP指令可跳转到OEP
实践:
1:查壳在这里插入图片描述
2:OD打开
在这里插入图片描述
3:F8
在这里插入图片描述
//对于寄存器,指令执行后发生改变的寄存器会用红色显示,此处ESP和EIP的值发生改变,因为执行pushad指令,将8个通用寄存器(EAX-EDI)的值保存至栈,栈中的值增加了,所以ESP的值发生变化,而EIP的值表示下一个要执行指令的地址,也发生变化
执行PUSHAD的原因是使栈平衡,这段代码的最后还有popad,两者执行后可以把ESP的值回到原值,这里不明白为什么使栈帧平衡要执行push和pop,如果没有这两步只执行movebp,esp,不是还有基准值,搞不懂push和pop的意义)

4:下硬件断点
在这里插入图片描述
//下硬件断点,与F2断点不同的是,硬件断点直到下断点地址处的指令执行完成后,才完成调试,也就是说,程序会不断执行直到遇到了硬件断点处的地址,把该处地址的指令执行完成后,才完成调试,此处在ESP为000DFF54处下硬件断点的原因,我的理解是,是为了到达popad处回到栈的初始状态完成解压缩代码,在popad未执行时,它前一个指令执行后ESP的值应该是000DFF54,所以运行后再次遇到ESP为000DFF54时,下一个命令是popad
(popad指令把pushad存储在栈中的值再次恢复到各个寄存器,我理解为8次pop命令)

5:F9运行
在这里插入图片描述
//猜测未执行popad时,ESP的值应该是000DFF54,此时还未将8个寄存器的值弹出栈。执行popad时的瞬间访问到硬件断点000DFF54,暂停调试,此时已执行了popad,回到了栈的初始状态,发现除了EIP其他寄存器值和初始寄存器的值一样

6:找到离popad最近的JMP,执行JMP跳转
在这里插入图片描述
//发现OEP处寄存器的值除了EAX和EIP,其他的的值和pushad的值一样
EAX中值不一样的原因是,EAX中保存函数的返回值,保存的是OEP的地址

7:脱壳
在这里插入图片描述
总结:
1:执行pushad,下硬件断点F9运行
2:找到popad后的第一个jmp指令F8
3:跳转到了OEP

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161728.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 0X7FFFFFFF,0X80000000「建议收藏」

    #include#include//INT_MAX与INT_MIN的头文件usingnamespacestd;intmain(){cout<<0x7FFFFFFF<

    2022年4月15日
    37
  • Mysql数据库备份策略

    Mysql数据库备份策略Mysql数据库备份策略我的petstore所用的数据库是Mysql。Mysql的数据库备份不象那些企业界数据库那样完善,分为完全备份、差分备份以及日记纪录等等。Mysql备份数据库两个主要方法是用mysqldump程序或直接拷贝数据库文件。mysqldump与MySQL服务器协同操作。直接拷贝方法在服务器外部进行,并且你必须采取措施保证没有客户正在修改你将拷贝的表。如果你想用文件系统备份来备份数

    2022年5月2日
    43
  • VIF检验相关性「建议收藏」

    VIF检验相关性「建议收藏」VIF可以用来度量多重共线性问题,VIFj=11−Rj2\quad\mathrm{VIF}_{j}=\frac{1}{1-R_{j}^{2}}VIFj​=1−Rj2​1​式子中,Rj2R_{j}^{2}Rj2​是第jjj个变量在所有变量上回归时的确定系数。如果VIF过大(比如大于5或10),则意味着存在多重共线性问题。#数据df=pd.read_excel(io=’数据.xlsx’,sheet_name=0,usecols=range(1,5))#务必注意:一定要加上常数项,#如果没

    2022年4月28日
    138
  • pycharm安装opencv-python_geany配置python

    pycharm安装opencv-python_geany配置python近期在学习计算机视觉,需要配置python以及OpenCV

    2022年8月27日
    3
  • RewriteCond指令格式[通俗易懂]

    RewriteCond指令格式[通俗易懂]RewriteCond指令格式语法:RewriteCondTestStringCondPattern[flags]RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当自身的模板(pattern)匹配成功且这些条件也满足时规则才被应用于当前URL处理。1、TestString是一个纯文本的字符串,除

    2022年6月13日
    35
  • 遗传算法matlab程序简单实例_遗传算法的matlab实现

    遗传算法matlab程序简单实例_遗传算法的matlab实现遗传算法程序(一):  说明:fga.m为遗传算法的主程序;采用二进制Gray编码,采用基于轮盘赌法的非线性排名选择,均匀交叉,变异操作,而且还引入了倒位操作!function[BestPop,Trace]=fga(FUN,LB,UB,eranum,popsize,pCross,pMutation,pInversion,options)%[BestPop,Trace]=…

    2022年9月4日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号