re——脱壳

前言

“壳”可以分为两类:压缩壳和加密壳。压缩壳的目的是压缩原程序的体积,很多恶意代码都采用压缩壳,以便于传输。加密壳也称保护壳,是指通过对原程序加密来防止文件被破解。一般而言,加密壳会增加文件的体积。常见的压缩壳包括UPX、ASPack、Nspack(北斗压缩壳)等,常见的加密壳有VMProtect、ASProtect等。所有的压缩壳都能被脱壳,但是加密壳脱壳的难度较大,因此比赛时出现压缩壳问题的概率较大。对于我们来说,壳就是阻碍我们进行逆向分析,得到flag的。

今天我们来一起学一下upx脱壳吧!

upx脱壳的简单操作

UPX(the Ultimate Packer for eXecutables,官网地址为https://upx.github.io/)

下载解压好之后,要记住文件的位置,比如我的就放在”D:\APP\upx”中

先打开命令提示符,输入 d: ,再输入 cd D:\APP\upx\upx-4.2.4-win64 (cd 后面的是你自己的安装路径)

最后输入 upx -d (需要脱壳的文件地址) 如图所示

upx -d 就是脱壳指令

用IDA打开后,一眼出flag,NSSCTF{UPX_c4n_3as1ly_5h3ll_pr0gr4m!},对应NSS里[SWPUCTF 2023 秋季新生赛]UPX

魔改壳

upx脱壳比较简单,但是只要做一些简单的操作就可以让upx工具失效,那就称为魔改壳。

例题:[LitCTF 2024]hello_upx

解压缩后拖到查壳工具中查壳,发现是upx壳,进行简单的脱壳操作,结果发现脱不了壳,那就是魔改壳。

于是把这个文件放到010里面查看

发现四个错误,upx不应该是小写,而是大写,所以应该将四处小写的upx,改成大写的,就将75 70 78 都改成55 50 58,再保存一下就好了。

再进行upx脱壳,这次就能脱了

用IDA打开文件,进行反汇编

分析一下代码的逻辑,只有让v4+i==v6[i],才能得出flag。

本题中涉及大小端序的知识,字节序分为两种:大端序和小端序。大端序(大端模式)是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中;小端序(小端模式)是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。下面有两段内存数据:

0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000

0000440: b484 6c4e 004e ed00 0000 0000 0100 0000

在大端模式下,第一行前32比特应该这样读:e6 84 6c 4e(假设int占4

字节)。

在小端模式下,第二行前32比特应该这样读:4e 6c 84 b4(假设int占4

字节)。

牢记:在IDA中,大于等于两字节的数据的存储方式和我们的阅读习惯相反。

写出exp