利用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)
上一篇 2022年7月19日 上午10:16
下一篇 2022年7月19日 上午10:16


相关推荐

  • 最短路径算法的编程与实现 C语言

    最短路径算法的编程与实现 C语言1 掌握最短路径算法的基本原理及编程实现 operatingsys Win11CPUinst x64Integrate ViusalStudio 建立一张图 选择一种存储结构 邻接矩阵或邻接表 初始化该图 2 用 Dijkstra 算法实现点与点之间的最短路径 1 实现图的两种表示方法 2 实现 Dijkstra 算法 1 程序 2 程序结果 1 程序运行 我使用的测试数据如下

    2026年3月16日
    1
  • 毕业设计方案_apabi document是什么文档

    毕业设计方案_apabi document是什么文档毕设存档——mdlt实现流程MATLAB环境配置mex-setup功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入M…

    2025年11月11日
    7
  • 代码空间项目 — InstantiationException的异常

    代码空间项目 — InstantiationException的异常java.lang.InstantiationException实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。这次项目中查询type时候

    2022年7月1日
    25
  • 卸载宝塔Linux面板命令

    卸载宝塔Linux面板命令1 进入 ssh 输入以下命令下载脚本 wgethttp download bt cn install bt uninstall sh2 执行脚本 若是 ubutnu 用户请在前面加 sudo 例子 sudoshbt uninstall sh shbt uninstall sh3 根据提示输入 1 或 2 后按回车清理面板或环境 若输入其他值或不输入直接回车则只卸载面板

    2026年3月26日
    2
  • 如何用AI算法识别骗保行为?蚂蚁保险智能风控模型首次公开![通俗易懂]

    如何用AI算法识别骗保行为?蚂蚁保险智能风控模型首次公开![通俗易懂]阿里妹导读:人生充满意外和不确定性,保险的使命,就是给人以安全感。风控是保险业务正常发展的重要环节,成长于互联网环境下的保险风控更为重要。今天,阿里工程师正在利用跨平台体系下的海量数据资源和智能风控模型,优化保险风控,提升保险业务整体风控能力,让保险更好帮助人们对抗风险,减少后顾之忧。保险风控的背景以及挑战商业保险是一种用于保障未来的商业行为。除了我们常见的车险、财产险、健康险等传统保险以外,运费

    2022年5月11日
    50
  • 分布式架构设计之电商平台

    分布式架构设计之电商平台何为软件架构?不同人的答案会有所不同,而我认为一个好的软件架构除了要具备业务功能外,还应该具备一定的高性能、高可用、高伸缩性及可拓展等非功能需求。而软件架构是由业务架构和技术架构两部分组成,因为有了业务结构才会催生出软件架构,进而来满足业务上的需求,所以,在做软件架构设计时,需要分为业务架构设计和技术软件架构设计,二者不可分离哦!那么,接下来就以本人实际工作中的电商平台为例,进行说明电商平台架构设计,因为不同行业产品系统不同业务不同,而催生的系统软件的实现要求及架构设计就不同了!

    2022年6月29日
    26

发表回复

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

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