首页
社区
课程
招聘
[原创] 借助 x64dbg 的 UPX 手工脱壳
发表于: 2021-6-21 17:35 31587

[原创] 借助 x64dbg 的 UPX 手工脱壳

2021-6-21 17:35
31587

流程图排版异常可以移步至我的博客

背景介绍

比赛过程中,一部分Re题会被加UPX壳。正常情况下只需要用upx -d /path/to/file即可脱壳,但偶尔有题目使用魔改的UPX(如下图)无法直接脱壳,这时就需要手工脱壳。本文记录了一种借助x64dbgScylla的手工脱壳方法。

 

魔改的UPX

准备

首先准备一个Test程序,初始情况下用IDA打开情况如下:

 

原始代码

 

现在使用upx -9 /path/to/file进行加壳,结果如下:

 

加壳后的DIE页面

 

使用IDA打开时会提示Some imported modules will not be visible because the IAT is located outside of memory range of the input file.,忽略后的结果如图:

 

加壳后的IDA页面

 

这样的代码完全无法阅读,字符串、函数信息等都已经没了。

 

下面开始手工脱壳。

脱壳

寻找入口点

首先要先在加壳后的程序中定位到原程序的入口点。使用x64dbg打开后直接运行一步,发现停在了pushad上。该指令将所有寄存器的值压栈,而在UPX的执行流程里,这一步之后会加载UPX的解压代码用于将原始程序解压。

upx的工作原理其实是这样的:首先将程序压缩。所谓的压缩包括两方面,一方面在程序的开头或者其他合适的地方插入一段代码,另一方面是将程序的其他地方做压缩。压缩也可以叫做加密,因为压缩后的程序比较难看懂,主要是和原来的代码有很大的不同。最大的表现也就是他的主要作用就是程序本身变小了。变小之后的程序在传输方面有很大的优势。其次就是在程序执行时,实时的对程序解压缩。解压缩功能是在第一步时插入的代码完成的功能。联起来就是:upx可以完成代码的压缩和实时解压执行。且不会影响程序的执行效率。

upx和普通的压缩,解压不同点就算在于upx是实时解压缩的。实时解压的原理可以使用一下图形表示:

1
2
graph LR;
  1-->2-->3-->4-->5-->6;

假设1是upx插入的代码,2,3,4是压缩后的代码。5,6是随便的什么东西。程序从1开始执行。而1的功能是将2,3,4解压缩为7,8,9。7,8,9就是2,3,4在压缩之前的形式。

1
2
graph LR;
  1-->7-->8-->9-->5-->6;

连起来就是:

1
2
3
4
5
6
graph LR;
  1==>2-.->3-.->4-.->5;
  7==>8==>9==>5==>6;
  2-->解密-->7;
  3-->解密-->8;
  4-->解密-->9;

参考文献:upx加壳原理_zacklin的专栏-CSDN博客

 

所以我们只要跟踪到这部分栈被弹出,就意味着解压完成。之后的代码就是原始代码。

 

那么如何跟踪这部分栈呢?只需要先F7步进,pushad执行完成后对当前栈顶的内存地址下一个硬件断点即可。

 

硬件断点

 

然后F5继续执行。再次中断处如图:

 

中断

 

可以看到EIP上方就是popad,说明UPX的解压过程已经结束,现在在进行一些清理工作。

 

看到下方00D0180000D01806的代码,它们在将缺失的栈段空间补齐,会循环若干次。故在00D01809这个jmp上下断点。执行到该语句后再F7步进一次,到达其跳转后的地点:

 

入口点

 

这里就是我们要找的入口点。

脱壳

找到入口点以后使用x64dbg自带的Scylla进行脱壳。

 

直接使用IAT Autosearch功能,期间可能会提示使用IAT Search Advanced,选“是”继续。然后Get Imports,最后直接Dump

 

Dump出来的文件使用IDA打开,可能依旧会提示IAT表缺失,不管它,直接看main函数。

 

脱壳后代码

 

Done :)


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-6-21 17:37 被Potat0编辑 ,原因: 明确排版异常点
收藏
免费 4
支持
分享
最新回复 (7)
雪    币: 578
活跃值: (808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习了,谢谢分享
2022-4-6 21:20
0
雪    币: 25
活跃值: (580)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这也是科锐脱UPX壳子3种方法之一,不过老王喜欢在ESP+8的位置下硬件断点
2022-4-7 10:08
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
可以可以
2022-8-26 10:31
0
雪    币: 149
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习了,谢谢分享
2022-9-29 23:29
0
雪    币: 96
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
WIN10系统用X32DBG脱UPX的壳,后修复IAT还是无法运行怎么回事呢
2022-11-9 09:54
0
雪    币: 369
活跃值: (2598)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢分享
2022-11-9 10:39
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
学习了,谢谢分享
2022-11-11 19:35
0
游客
登录 | 注册 方可回帖
返回
//