DASCTF X SU 春季挑战赛:逆向工程与流量分析实战复盘

发布时间:2026/7/16 4:30:57
DASCTF X SU 春季挑战赛:逆向工程与流量分析实战复盘 1. 逆向工程实战从混淆代码到算法还原1.1 RC4算法变形与密钥提取在2024 DASCTF春季赛中一道逆向题采用了魔改版RC4算法。题目给出的是一个被混淆的Windows PE文件使用IDA Pro分析时发现核心加密函数存在大量花指令。通过动态调试发现程序在0x401619地址处对标准RC4算法进行了三处关键修改密钥调度阶段引入非线性运算s[v5] 5 * (v3 66) - 10每轮交换后对S盒元素异或固定值s[i] ^ 2密钥流生成时额外添加偏移k[v4] 71实战解密脚本如下def modified_rc4_decrypt(cipher, key): # 初始化S盒含魔改逻辑 s list(range(256)) j 0 for i in range(256): j (j s[i] key[i % len(key)] 2*j) % 256 # 修改点1 s[i], s[j] s[j], s[i] s[i] ^ 2 # 修改点2 # 生成密钥流 i j 0 plain [] for byte in cipher: i (i 1) % 256 j (j s[i]) % 256 s[i], s[j] s[j], s[i] k s[(s[i] s[j]) % 256] plain.append(byte ^ (k 71)) # 修改点3 return bytes(plain)1.2 SM4算法识别与侧信道分析另一道IoT逆向题中参赛者需要从ARM架构的固件中识别SM4算法。通过以下特征可以快速定位常量0xA3B1BAC6出现在初始化函数32轮Feistel结构使用S盒进行非线性变换使用QEMU模拟执行时通过记录缓存命中率发现存在时间侧信道漏洞。以下是关键代码段// 漏洞点轮密钥生成耗时与密钥相关 uint32_t sm4_key_schedule(uint32_t mk[4]) { uint32_t k[36]; for (int i0; i35; i) { if (mk[i%4] 0x80000000) { // 分支耗时不同 k[i] slow_rotate(mk[i%4], 13); } else { k[i] fast_rotate(mk[i%4], 13); } } }2. 网络流量分析从原始数据包到攻击链还原2.1 ICMP隐蔽信道检测在Hi!Hecker!题目中攻击者使用ICMP Type8回显请求包传输数据。通过Wireshark筛选发现异常特征数据包长度固定为600字节序列号小于9有效载荷使用HexASCII编码提取数据的tshark命令tshark -r traffic.pcap -Y icmp.type8 icmp.seq 9 -T fields -e data.data extracted.txt数据分析脚本示例with open(extracted.txt) as f: data bytes.fromhex(f.read().replace(:, )) # 发现尾部有Jenkins密钥特征 print(data[-32:].decode())2.2 HTTP流量中的WebShell通信在Web题目中攻击者使用HTTP Cookie字段传输加密命令。通过分析发现请求头包含异常CookieSESSIONENCODED(base64(xor(key, data)))响应体使用gzip异或双重编码心跳包间隔固定5秒解密脚本核心逻辑def decrypt_webshell(data): key b093c1c388069b7e1 decoded base64.b64decode(data) return bytes(d ^ key[i%16] for i,d in enumerate(decoded))3. 加密流量解析技巧3.1 TLS指纹识别通过JA3指纹识别恶意流量771,49195-49196-52393-49200...,23-65281-10-11-35-16-5-13对应OpenSSL 1.1.1b版本结合SNI字段malicious.com可定位C2服务器。3.2 协议逆向案例某IoT设备使用自定义加密协议分析发现2字节魔数0xA55A4字节小端序长度字段Payload使用AES-ECB模式加密固定IV00 11 22 33 44 55 66 77使用scapy解析的示例class CustomProto(Packet): fields [ ShortField(magic, 0xA55A), LEIntField(length, None), StrFixedLenField(iv, b\x00*16, 16), StrLenField(data, , length_fromlambda p:p.length) ]4. 实战中的调试技巧4.1 IDA远程调试IoT设备步骤在设备运行gdbserver :1234 /bin/binaryIDA配置Debugger-Remote ARM Linux/Android debugger设置断点在算法关键比较指令处使用如下Python脚本自动化测试import idaapi from idc import * def test_input(input_data): addr 0x1234 # 测试函数入口 idaapi.continue_to(addr) idaapi.wait_for_next_event(WFNE_SUSP, -1) # 写入测试数据到内存 write_memory(0x2000, input_data) set_reg_value(0x2000, R0) # 设置参数 single_step() return get_reg_value(R0) # 获取返回值4.2 动态Hook技术使用Frida拦截加密调用Interceptor.attach(Module.findExportByName(libcrypto.so, EVP_EncryptUpdate), { onEnter: function(args) { console.log(Encrypting:, hexdump(args[1], {length: ptr(args[2]).toInt32()})); } });5. 竞赛经验与工具链推荐的高效工具组合静态分析Ghidra IDA Pro插件动态调试Qiling框架 QEMU流量分析NetworkMiner Wireshark Lua插件自动化Python pwntools脚本库常见踩坑点ARM/Thumb模式切换误判使用altg设置CPSR寄存器反调试技巧检测/proc/self/status中的TracerPid时间校验绕过Hookgettimeofday函数某次实际比赛中通过修改系统时钟绕过证书有效期检查的代码int fake_gettimeofday(struct timeval *tv, void *tz) { tv-tv_sec 1700000000; // 固定为2023年 return 0; } // 使用LD_PRELOAD加载在逆向工程这条路上最宝贵的经验就是保持耐心。记得有次分析一个混淆严重的样本花了三天才理清控制流最终发现核心算法竟然藏在异常处理流程里。建议新手从简单的CrackMe开始逐步挑战CTF赛题积累的每个技巧都会在未来某个关键时刻派上用场。