大家好,又见面了,我是你们的朋友全栈君。
文章目录
- 前言
- UPX
-
- 技术原理
- 应用范围
- 软件使用
- CTF实战
-
- 程序查壳
- UPX脱壳
- 总结
前言
加壳软件分两类:
- 压缩壳:压缩的目的是减少程序体积,如 ASPack、UPX、PECompact 等;
- 加密壳:加密是为了防止程序被反编译(反汇编)、跟踪和调试,如 ASProtect、Armadillo、 EXECryptor、Themida、VMProtect。
壳的存在会让我们找不到程序的真实入口点,从而不能正确的分析反汇编程序,也就对程序起到了一定的保护作用。
加密壳的基本思路:
- 将原本程序的 PE 相关代码复制到补丁(壳)中;
- 加密程序;
- 修改程序入口点,使得程序启动后会先运行补丁程序;
- 补丁程序会根据先前复制的相关代码对程序进行解密和还原,使得程序能够正常运行;
- 还原后再返回执行原本的入口点。
本文不讨论加密壳,而是通过攻防世界一道 CTF 逆向题目 simple-unpack 来学习下基于 UPX 的压缩壳的特征和脱壳。
UPX
UPX (the Ultimate Packer for eXecutables) 是一款先进的可执行程序文件压缩器, 也是一个著名的压缩壳,主要功能是压缩 PE 文件(比如 exe、dll 等文件),有时候也可能被病毒用于免杀。
UPX 壳是一种保护程序(一般是 EXE 文件的一种外保护措施),其主要用途 :
- 让正规文件被保护起来,不容易被修改和激活成功教程;
- 使文件压缩变小;
- 保护杀毒软件安装程序,使之不受病毒侵害;
- 木马,病毒的保护外壳,使之难以为攻破。
技术原理
UPX 对于可执行程序资源压缩,是保护文件的常用手段。俗称加壳,加壳过的程序可以直接运行,但是不能查看源代码。要经过脱壳才可以查看源代码。
UPX 加壳其实是利用特殊的算法,对 EXE、DLL文件里的资源进行压缩。类似WINZIP 的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。解压原理,是加壳工具在文件头里加了一段指令,告诉 CPU,怎么才能解压自己。当加壳时,其实就是给可执行的文件加上个外衣。用户执行的只是这个外壳程序。当执行这个程序的时候这个壳就会把原来的程序在内存中解开,解开后,以后的就交给真正的程序。
应用范围
压缩文件
用 UPX 压缩过的可执行文件体积缩小 50%-70% ,这样减少了磁盘占用空间、网络上传下载的时间和其它分布以及存储费用。 通过 UPX 压缩过的程序和程序库完全没有功能损失和压缩之前一样可正常地运行,支持的大多数格式程序,没有运行时间或内存的不利后果。
加壳脱壳
程序为了反跟踪、被人跟踪调试、防止算法程序被别人静态分析就需要加壳。使用加壳软件加密代码和数据,就可以保护你程序数据的完整性,防止被程序修改和被窥视内幕。
软件使用
UPX 软件的 Github下载地址,拿来即可食用:
在 cmder 中打开,使用 -h
参数可以查看使用方法:
核心的用法如下:
upx sample.exe | upx -d sample.exe |
---|---|
压缩可执行文件 | 解压缩可执行文件 |
CTF实战
了解完关于 UPX 加壳的基础知识后,回归正题,返回到 simple-unpack 题目中来(附件下载地址),题目如下:
程序查壳
既然题目都已经提示是 “一个被加壳的二进制文件” 了,那么下载后当然是查看下加壳情况了,可以看到是 64 位的文件,做了 UPX 加壳保护:
直接尝试拖入 IDA Pro 64bit 查看程序结构,会看到压缩壳处理后的程序的函数极少:
然而发现在 16 进制查看区域点击“Alt T
”快捷键进行 flag
关键词搜索,即可看到 flag(惊不惊喜,意不意外…):
这大概就是压缩壳的弊端了,没有对源程序进行加密,压缩后还是可泄露源程序的数据。
UPX脱壳
虽然上面已经拿到了 flag 值,但是本文重点还是要学习下 UPX 的脱壳、以及对比 UPX 加壳、脱壳后的文件结构,所以下面继续对目标文件进行脱壳。
不废话,直接上 upx 软件进行脱壳(解压缩):
随后将脱壳后的文件直接拖入 IDA Pro 进行反汇编,可以看到源程序的代码结构了,并在 main 函数中成功找到 flag,如下图所示:
最终 flag 值:flag{Upx_1s_n0t_a_d3liv3r_c0mp4ny}
,over!
总结
本文学习记录了 UPX 软件加壳、脱壳(压缩与解压缩)的方法,并直观比较了其加壳后、脱壳后的文件结构,总的来说压缩壳的作用有限,UPX 已经被应用很久了,脱壳技术成熟,使用于防止反编译、病毒免杀的作用十分有限,杀毒引擎基本能直接识别出做了 UPX 加壳的病毒程序。所以要想让加壳达到防止反编译、反调试跟踪的目的,还是得采用加密壳而非压缩壳。对于加密壳的激活成功教程分析练习,等待下一步的学习!
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161703.html原文链接:https://javaforall.cn