October 24, 2023

什么叫UPX!

今日连着遇到 UPX 魔改题,受不了了,于是把一个历史遗留问题解决了

UPX

Win下魔改

一般的压缩壳已经满足不了出题人了,于是出题人改了UPX段名,就比如说这样,这个.rsrc原来是个upx2

image-20231024231633168

而改回去也要注意,就像这里是要把5个字节改成4个字节,最后一个字节标00,然后就可以正常脱壳,至于要改成什么样,可以随便拉一个exe加上upx壳对比一下即可,再者windows下的其实调试器很全,也很好动调脱下来

这题改成这样即可

image-20231024231820174

Linux下魔改

首先精读文章

https://bbs.kanxue.com/thread-275753.htm#msg_header_h1_0

关键点

经过UPX处理后,压缩后的文件格式如下。

new eheader(64 bytes) (文件头)

其中,b_info、l_info和p_info是三个结构体。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 在每个压缩块之前,存放压缩前和压缩后的数据大小
struct b_info { // 12-byte header before each compressed block
uint32_t sz_unc; // uncompressed_size
uint32_t sz_cpr; // compressed_size
unsigned char b_method; // compression algorithm
unsigned char b_ftid; // filter id
unsigned char b_cto8; // filter parameter
unsigned char b_unused;
};
// 存放校验数据和"UPX!"魔数
struct l_info // 12-byte trailer in header for loader (offset 116)
{
uint32_t l_checksum;
uint32_t l_magic;
uint16_t l_lsize;
uint8_t l_version;
uint8_t l_format;
};
// 全文只有一个该结构体,存储的是原文件的大小
struct p_info // 12-byte packed program header follows stub loader
{
uint32_t p_progid;
uint32_t p_filesize;
uint32_t p_blocksize;
};

那么linux下的,gdb就算脱下来,符号什么的也没恢复,程序运行不了,这题又是rust写的,不调试太难逆了

这题也同样改了名字

image-20231024232149328

然而改回来也不行,还改了一个地方,就是最后四个字节,看结构体可知最后四个字节是 p_info 的文件偏移

然而这边直接爆 0,工具脱不了是原因也就是这

image-20231024232256579

那我们手动恢复一下即可,程序表头结束后+12的地方就是 p_info 的偏移地址

于是找到是 F4,注意小端序填到第一个字节即可

image-20231024232450109

DASCTF X SU
🍬
HFCTF2022
🍪

About this Post

This post is written by P.Z, licensed under CC BY-NC 4.0.