moectf2025 upx

壳是什么?upx是什么?upx可以用来干什么?

1. 什么是“壳”?

是一段包裹在程序外面的辅助代码。

  • 作用:程序启动时,壳先运行,负责把里面真正的程序解压或解密到内存里,然后再运行程序。
  • 分类:一种是为了减小体积(压缩壳),一种是为了防止被破解(加密壳)。

2. 什么是 UPX?

UPX 是一个开源的软件工具。

  • 定位:它是目前最流行的“压缩壳”工具。
  • 特点:压缩率高、解压速度极快,支持 Windows、Linux 等多种系统。

3. UPX 可以用来干什么?

  • 压缩文件:把 10MB 的 .exe 变成 3MB,节省磁盘和带宽。
  • 加壳:给程序穿衣服,隐藏原始代码,让别人没法直接看到程序里的文字信息。
  • 脱壳:使用 upx -d 命令,把被 UPX 压缩过的程序还原成原始状态,方便分析代码。

题目一打开,函数这么少根本不可能,肯定是有壳在外面把它压缩了

image-20260302212205183

先查看壳,用exeinfo,把文件托进快捷方式就ok

image-20260302212441353

发现upx,用upx去壳

拿到后shift+f12字符串查看,看到可疑字符串双击,按x搜索到具体位置,f5反汇编

1
2
3
v8 = Buffer[v7] ^ 0x21;             // 第一步:当前字符 ^ 0x21
if ( v6 < (int)v4 - 1 )
v8 ^= Buffer[v7 + 1]; // 第二步:结果 ^ 下一个字符

找了个大佬的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 目标密文序列 (T)
T = [
35, 43, 39, 54, 51, 60, 3, 72, 100, 11,
29, 118, 123, 16, 11, 58, 63, 101, 118, 41,
21, 55, 28, 10, 8, 33, 62, 60, 61, 22,
11, 36, 41, 36, 86
]

# 2. 已知开头
flag = list(b"moectf{")

# 3. 递推还原:下一个字符 = 当前密文 ^ 当前字符 ^ 0x21
for i in range(len(flag) - 1, 34):
next_char = T[i] ^ flag[i] ^ 0x21
flag.append(next_char)

# 4. 输出结果
print(bytes(flag).decode())