UPX脱壳逐一跟踪分析

UPX脱壳逐一跟踪分析UPX脱壳逐一跟踪分析写在前面OD跟踪命令先结合PE知识分析分析“新年快乐.exe”写在前面之前看到的UPX脱壳文章都只是教了方法,对UPX的原理少有提及。看了《逆核》的UPX脱壳一章后,俺尝试把UPX脱壳与PE文件结构的知识结合起来整理了一些(也可联系压缩器Paker的知识)。分析样本来自BUUCTF:Reverse题目“新年快乐”(本文将寻找样本的OEP)OD跟踪命令可能会用到的几个跟踪命令:命令快捷键作用AnimateIntoCtrl+F7反复执行StepIn

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

写在前面

之前看到的UPX脱壳文章都只是教了方法,对UPX的原理少有提及。看了《逆核》的UPX脱壳一章后,俺尝试把UPX脱壳与PE文件结构的知识结合起来整理了一些(也可联系压缩器Paker的知识)。
分析样本来自BUUCTF:Reverse题目“新年快乐”(本文将寻找样本的OEP)

OD跟踪命令

可能会用到的几个跟踪命令:

命令 快捷键 作用
Animate Into Ctrl+F7 反复执行Step Into命令(画面显示)
Animate Over Ctrl+F8 反复执行Step Over命令(画面显示)
Trace Into Ctrl+F11 反复执行Step Into命令(画面不显示)
Trace Over Ctrl+F12 反复执行Step Over命令(画面不显示)
停止跟踪 F7

Animate:执行时画面会跟着光标移动一直显示;
Trace:会在事先设置好的跟踪条件处停下,并生成日志文件。
跟踪命令适合用在大型代码,一好处是容易发现短循环。
我分析时只是使用了F8/F7/F4。

先结合PE知识分析

一般情况下,分析压缩后的UPX壳,可以看到第一个节区的名称为UPX0,SizeOfRawData=0,而VirtualSize=1000h(大于0),第二个节区UPX1,它的PointerToRawData和第一个节区的相同。也就是说,第一个节区在文件中是不占用空间的,只有运行时才分配大小。
其实,第二个节区含有解压代码和将被解压的代码(压缩前的代码),在加载过程中,第二个节区的解压代码运行,将被解压代码解压到第一个节区。最后到达EP执行代码。

分析“新年快乐.exe”

  1. 打开:
    打开程序后

  2. 根据上文,下面会先执行解压代码,这个代码在UPX1节区,在此节区设置内存访问断点。
    Memory map

  3. F9几次,就能在UPX1看到经典pushad了。
    解压代码 4. F8一会可以在下面不远处发现一个循环
    循环1
    大致作用:从ESI(指向UPX1)中读取一个字节写入EDI(指向UPX0)
    需要F4跳出循环的话记得先删除刚刚下的内存断点,继续F8

  4. 提示:后面遇到的这个循环得跳出去
    循环

  5. 走出上面循环就会到这,这里的循环比较重要。它有一个像重定位表的作用,会把机器码为E8和E9(CALL/JMP指令)后跟的地址修改。重要循环

0040E3C2    5E              pop esi                                  ; 新年快乐.<ModuleEntryPoint>
0040E3C3    89F7            mov edi,esi     			//EDI=ESI ; 新年快乐.00401000
0040E3C5    B9 4A000000     mov ecx,0x4A	
0040E3CA    8A07            mov al,byte ptr ds:[edi]		//0101540A 取EDI的值进行对比
0040E3CC    47              inc edi                                  ; 新年快乐.00401006
0040E3CD    2C E8           sub al,0xE8
0040E3CF    3C 01           cmp al,0x1
0040E3D1  ^ 77 F7           ja short 新年快乐.0040E3CA		//判断取出来的值是否是E8/E9
0040E3D3    803F 00         cmp byte ptr ds:[edi],0x0
0040E3D6  ^ 75 F2           jnz short 新年快乐.0040E3CA
0040E3D8    8B07            mov eax,dword ptr ds:[edi]		//需要修改的地址
0040E3DA    8A5F 04         mov bl,byte ptr ds:[edi+0x4]
0040E3DD    66:C1E8 08      shr ax,0x8
0040E3E1    C1C0 10         rol eax,0x10
0040E3E4    86C4            xchg ah,al
0040E3E6    29F8            sub eax,edi                              ; 新年快乐.00401006
0040E3E8    80EB E8         sub bl,0xE8
0040E3EB    01F0            add eax,esi                              ; 新年快乐.00401000
0040E3ED    8907            mov dword ptr ds:[edi],eax		//处理后的新地址放入EDI
0040E3EF    83C7 05         add edi,0x5
0040E3F2    88D8            mov al,bl
0040E3F4  ^ E2 D9           loopd short 新年快乐.0040E3CF
  1. 走出循环后,下面来到这,设置IAT表
    IAT
    40E3F6处执行后ESI = 401000(第一个节区),EDI = 40D000(第二个节区)
    API名字
    在这里插入图片描述
    GetProcAddress可以根据函数名称获取地址:GetProcAddress
    按照书中的说法,此段程序会根据API名称,用GetProcAddress()函数获取API函数的地址,然后把地址输入到EBX指向的原IAT区域。
  2. 设置完IAT表,差不多会到程序入口点。我的想法是要到程序入口点所在的第一节区,需要有一个大的往上跳转,如是分析,然后有:
    最后
    401280就是程序的OEP

本人是菜鸡,调试能力有限,如有错误的地方麻烦指出。

这篇文章非工具脱UPX壳,也涉及PE知识:
https://my.oschina.net/u/1171187/blog/1143063
(侵权则删)

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

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

(0)
上一篇 2022年7月12日 下午9:16
下一篇 2022年7月12日 下午9:16


相关推荐

  • ExaGrid获得+73的净推荐值

    ExaGrid获得+73的净推荐值根据NPS标准,此分数值被归为“优秀”马萨诸塞州韦斯特伯鲁–(美国商业资讯)–备份用超融合二级存储器领先供应商ExaGrid®今日宣布,在近日开展的净推荐值(NPS)调查中,该公司的NPS为+73。NPS客户忠诚度指标用于测评现有客户向同行推荐供应商产品或服务的可能性。得到的NPS分数可能低至-100或高达+100。ExaGrid的大多数竞争对手的NPS介于+10和+20之间,而Exa…

    2022年6月6日
    33
  • av狼 php,www.ygyyxx.com

    av狼 php,www.ygyyxx.comDomainName:YGYYXX.COMRegistryDomainID:2350998641_DOMAIN_COM-VRSNRegistrarWHOISServer:whois.namesilo.comRegistrarURL:http://www.namesilo.comUpdatedDate:2020-01-08T14:48:59ZCreationDate:20…

    2026年2月19日
    5
  • linux 查看本地防火墙设置,Linux防火墙设置命令的几种方法

    linux 查看本地防火墙设置,Linux防火墙设置命令的几种方法iptables 防火墙 1 基本操作 查看防火墙状态 serviceiptab 停止防火墙 serviceiptab 启动防火墙 serviceiptab 重启防火墙 serviceiptab 永久关闭防火墙 chkconfigipt 永久关闭后重启 chkconfigipt

    2026年3月17日
    1
  • Claude Code Skills 基础教程

    Claude Code Skills 基础教程

    2026年3月16日
    3
  • OJ错误提示类型

    OJ错误提示类型答案正确(Acepted,AC)  恭喜你!所提交的代码通过了数据!这个评测结果应该是大家最喜欢见到的,也非常好理解。如果是单点测试,那么没通过一组数据,就会返回一个Accepted;如果是多点测试,那么只有当通过了所有数据时,才会返回Accepted。编译错误(CompileError,CE)  很显然,如果代码没有办法通过编译,那么就会返回CompileError。这是要…

    2022年6月24日
    24
  • Springboot文件上传_maven上传jar包到远程仓库

    Springboot文件上传_maven上传jar包到远程仓库springboot文件上传机制:1.访问路径2. 上传完成后返回访问文件地址3. 我们只需要访问返回的地址就可以访问到图片4. yaml配置文件(localpath是实际存储的地址)5. 添加配置类,进行访问地址和存储地址映射 @Value(“${file.upload.suffixPath}”) private String uploadSuffixPath; @Value(“${file.upload.localPath}”) private Strin

    2022年8月8日
    9

发表回复

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

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