强网杯 2024 All RE wp
字数 1004 2025-08-20 18:17:53
强网杯 2024 All RE WP 逆向工程详细解析
1. MIPS逆向分析
题目特征
- 使用QEMU模拟器加载MIPS二进制文件,存在反调试陷阱(调试/attach状态下无法获取关键异或值)。
- 虚假Flag:直接解MIPS二进制会得到假Flag。
关键步骤
-
定位关键函数
- IDA中搜索
23000,定位校验函数,交叉引用发现对Flag头部和长度的检查。 - 魔改RC4加密:对输入字符串进行加密并异或操作。
- IDA中搜索
-
解密脚本
#include <stdio.h> #include <malloc.h> unsigned char N_str[] = {0xDE, 0xAD, 0xBE, 0xEF}; unsigned char map1[256], map2[256]; void swap(unsigned char *inp, int x, int y) { unsigned char ch = inp[x]; inp[x] = inp[y]; inp[y] = ch; } void init() { for (int i = 0; i < 256; i++) { unsigned char v3 = ((((i << 7) | (i >> 1)) << 6) ^ 0xC0 | (((i << 7) | (i >> 1)) >> 2) ^ 0x3B) ^ 0xBE; unsigned char out = ((((16 * (((32 * v3) | (v3 >> 3)) ^ 0xAD)) | ((((32 * v3) | (v3 >> 3)) ^ 0xAD) >> 4)) ^ 0xDE) >> 5) | (8 * (((16 * (((32 * v3) | (v3 >> 3)) ^ 0xAD)) | ((((32 * v3) | (v3 >> 3)) ^ 0xAD) >> 4)) ^ 0xDE))); map1[out] = i; map2[i] = out; } } unsigned char *de_rc4(unsigned char *inp) { // RC4解密逻辑(略) // 关键操作:交换字节、异或0xA、解密映射 } int main() { init(); unsigned char cip[] = {0xC4, 0xEE, 0x3C, 0xBB, 0xE7, 0xFD, 0x67, 0x1D, 0xF8, 0x97, 0x68, 0x9D, 0x0B, 0x7F, 0xC7, 0x80, 0xDF, 0xF9, 0x4B, 0xA0, 0x46, 0x91}; swap(cip, 12, 16); swap(cip, 7, 11); for (int i = 0; i < 22; i++) cip[i] ^= 0xa; unsigned char *m = de_rc4(cip); printf("flag{%.*s}", 22, m); return 0; }Flag:
flag{QeMu_r3v3rs3in9_h@ck6}
2. REMEM (AES白盒逆向)
题目特征
- ELF文件修复后,程序通过mmap动态加载Shellcode片段执行。
- 收集所有Shellcode片段后,识别为AES白盒加密。
解题步骤
-
收集Shellcode
- 动态调试获取所有mmap的Shellcode片段(如
0x7F722B883000处的指令流)。 - 整理出AES的轮密钥加、字节代换、行移位等操作。
- 动态调试获取所有mmap的Shellcode片段(如
-
差分故障分析
- 通过注入故障获取中间状态,推导出密钥。
- 关键脚本(Python):
from struct import pack flag = pack(">I",0x33636662) + pack(">I",0x336f1d5 + 0x5e2f4391) + ... # 拼接各part print("flag{" + flag.hex() + "}")
Flag:
flag{3cfbaf5f9a18382aa23}
3. EZ_VM (虚拟化逆向)
题目特征
- 实现自定义虚拟机,系统调用通过
syscalls/nt/64/表恢复符号。 - 手动定义虚拟机上下文结构体(包含寄存器、内存等)。
逆向步骤
- 结构体恢复
struct context { _QWORD regs[16]; // 寄存器 _QWORD stack_base; // 栈基址 _QWORD opcode; // 操作码 }; - 动态跟踪
- 对输入流下内存断点,记录数据流变化(如AES行移位特征)。
4. SNAKE (贪吃蛇算法)
题目特征
- 输入序列需最小化移动步数,通过箱子的移动次数生成Flag的MD5。
解题步骤
-
自动求解
- 使用开源推箱子求解器配置地图,获取最优路径。
- 移动序列:
2,12,13,9,21,13,25,31,3。
-
Flag生成
import hashlib moves = [2,12,13,9,21,13,25,31,3] md5 = hashlib.md5(','.join(map(str, moves)).encode()).hexdigest() print("flag{" + md5 + "qwb!}")
5. SOLVE2-APK (Android逆向)
题目特征
- JEB反编译关键函数,发现混淆严重的TEA变种加密。
解密流程
- TEA解密核心
void decrypt(uint32_t v[2], uint32_t k[4]) { uint32_t sum = 0x61C88647 * 32; for (int i = 0; i < 32; i++) { v[1] -= ((v[0] << 4) ^ (v[0] >> 5)) + v[0] ^ (sum + k[(sum >> 11) & 3]); sum += 0x61C88647; v[0] -= ((v[1] << 4) ^ (v[1] >> 5)) + v[1] ^ (sum + k[sum & 3]); } } - 多层校验
- 第一层:TEA解密后校验。
- 第二层:后32字节异或校验。
Final Flag: flag{iT3N0t7H@tH@E6D0YOV7hInkS0}
总结
- 工具链:IDA/QEMU/JEB/BPFtrace/Frida。
- 技巧:动态插桩、差分分析、结构体恢复、自动化求解。
- 关键点:魔改算法识别、反调试绕过、数据流跟踪。