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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python编程新手常犯的错误_python数组从0还是1

    python编程新手常犯的错误_python数组从0还是1在下面的例子中,希望做到的是数组a,b中元素大于3的置为1,其余为0。应该先做置0操作。程序:importnumpyasnpa=[1,2,2,3,4,5]a=np.array(a)b=[1,2,2,3,4,5]b=np.array(b)#错误的例子a[a>3]=1a[a<=3]=0print(‘a’,a)b[b<=3]=0b[b>3]=1print(‘b’,b)输出:a[00000

    2022年8月13日
    5
  • Win10图标变白纸了,恢复方法

    Win10电脑桌面图标变成白纸了,恢复步骤第一种方法(此方法失败用第二种)首先开启显示隐藏受保护的系统文件和文件夹的设置。打开计算机,单击【文件】菜单中的【更改文件夹和搜索选项】选项。切换到【查看】选项卡,在【高级设置】选择【显示隐藏的文件、文件夹和驱动器】,然后单击【确定】按钮保存设置,之后关闭。键盘按WIN+R组合键,弹出窗体里键入【%USERPROFILE%\AppData\Local】回车键确定打开的文件夹窗口删除隐藏状态的IconCache.db图标缓存文件,搞定。第二种方法

    2022年4月5日
    3.8K
  • 面试之Redis

    面试之Redis面试之Redis

    2022年4月23日
    51
  • Java学习之Response篇

    Java学习之Response篇0x00前言续上篇文章内容,这篇本章来更新Response。0x01Response常用方法:setStatus(intsc):设置响应状态码se

    2021年12月12日
    55
  • pycharm安装社区版还是专业版_pycharm专业版怎么激活

    pycharm安装社区版还是专业版_pycharm专业版怎么激活1.找到pycharm社区版安装目录下,的uninstall文件。对原来的pycharm社区版本进行卸载。2.到pycharm官网下载专业版本,这里我选择的是最新版本的pycharm(2022.1.3),win系统下载链接(官网):https://download-cdn.jetbrains.com/python/pycharm-professional-2022.1.3.exe具体安装过程就不给大聪明们摆出来了3.到这里就安装好了,测试成功,输出“Hi,PyCharm”4.引入之前pychar

    2022年10月21日
    3
  • QQ强制聊天工具,教你如何强制用QQ与陌生人聊天

    QQ强制聊天工具,教你如何强制用QQ与陌生人聊天

    2021年8月13日
    487

发表回复

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

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