REVERSE-毛毛虫的逆袭
ISCC2026 WriteUp 提交模板
REVERSE-毛毛虫的逆袭
解题思路
- UPX脱壳
发现upx壳,upx -d xxx脱壳。
先运行下

2.分析逻辑
IDA 中查看 main,可以看到程序先打印提示:


用 fgets 读取输入,并检查总长度必须为 26。之后程序取出中间 20 个字符作为真正参与校验的数据。

这里会记录下开始时间和校验前时间,如果 v14 <= 5.0,会进入一段可打印字符位移逻辑。

其实对应逻辑如下:
seed = dword_14003F010; // 30
for (i = 0; i < 20; i++) {
seed = seed * 1103515245 + 12345;
key = (seed >> 24) % 95;
enc[i] = ((input[i] - 32 + key) % 95) + 32;
}
memcmp(enc, "\\)e [JIiUxF4X]gU,viN", 20);
这里字符范围是 ASCII 可打印区间 [32, 126],模数为 95。因此只需要把加法改成减法即可逆推原始输入。
然后就可以写脚本了,这里直接放到EXP那里
- flag

ISCC{eEn#os:@&RPr1*[ b?#)}
Exp
Entarget = bytes([
0x5c, 0x29, 0x65, 0x20, 0x5b,
0x4a, 0x49, 0x69, 0x55, 0x78,
0x46, 0x34, 0x58, 0x5d, 0x67,
0x55, 0x2c, 0x76, 0x69, 0x4e,
])
middle = []
seed = 30
for b in Entarget:
seed = (seed * 0x41C64E6D + 0x3039) & 0xffffffff
key = (seed >> 24) % 95
middle.append(((b - 32 - key) % 95) + 32)
flag = b"ISCC{" + bytes(middle) + b"}"
print(flag.decode())

浙公网安备 33010602011771号