SwampCTF Re WP
字数 1498 2025-08-30 06:50:28
SwampCTF逆向工程解题报告
概述
本文档详细分析SwampCTF中的两道逆向工程题目:"Midi Melody"和"Wamp Audio"。这两道题目都涉及音频处理相关的逆向工程,需要结合静态分析和动态调试来解决问题。
第一题:Midi Melody
题目描述
题目提供了一个MIDI音乐文件和一个可执行文件midiGen,midiGen根据输入参数生成不同的音符结果。
关键分析
-
文件头分析:
- 程序使用
fwrite(&ptr, 0x16uLL, 1uLL, s)写入MIDI文件头 - 写入的值包括:
0x60000006468544DLL、0x544DD40001000100LL、0x40000006B72544DLL
- 程序使用
-
参数处理:
- 输入参数只有
-m、-j、-r三种 - 程序从第三个参数开始处理(
for ( j = 2; j < argc; ++j ))
- 输入参数只有
-
音符生成逻辑:
- 输入
-m:v8=0,取v14[v4]值,v4++ - 输入
-j:v8=1,取v13[v4]值,v4++ - 输入
-r:v8=3,取v14[0]值,v4=1
- 输入
-
解题方法:
- 使用DFS实现爆破,每次从三个选项中选一个
- 检查选取的4字节是否与题目给的
audio.midi对应位置的4字节相同 - 第二个参数可以随便填
-
密码转换:
- 生成的
jmr字符序列类似摩斯密码 -j对应短、-m对应长、-r对应空格- 第一个
I改成S即为flag
- 生成的
最终Flag
swampCTF{M1D1-WASNT-THAT-H@RD}
第二题:Wamp Audio
题目描述
题目提供了一个wamp格式的音频文件和一个wamp可执行文件,该程序将WAV文件加密为WAMP格式。
关键分析
-
文件处理流程:
- 使用
tinywav库进行文件读写操作 tinywav_open_read读取输入文件
- 使用
-
核心处理逻辑:
- 主循环处理音频数据
- 处理2000字节的WAV数据块
- 每两字节做除以32767.0的操作(归一化为-1到1间的浮点数)
- 从2000字节扩充到4000字节(每个采样点用4字节浮点数表示)
-
RLE压缩:
sub_555555555410函数实现了RLE(游程编码)压缩- 存储格式:两字节一组,第一个字节是长度
l,第二个字节是值v,表示连续l个v值 - 压缩后补充到8000字节
-
解题步骤:
- 从文件头后每8000字节一组处理
- 解压RLE恢复原来的4000字节(注意截断多余数据)
- 将4000字节浮点数转为2000字节的WORD数据
- 重新拼接WAV文件头
-
验证方法:
- 使用小WAV文件测试
- 结合010 Editor查看Hex值
- 实现与出题人代码类似的脚本进行对比测试
最终Flag
swampCTF{audio_formats_need_optimization}
总结与技巧
-
动态调试技巧:
- 对于需要参数的程序,在IDA调试时需要在Debugger选项中填写parameters
- 复杂函数可以交给GPT初步分析,再通过动态调试确认功能
-
逆向思维:
- 第一题:通过少量参数测试观察生成的文件变化
- 第二题:使用小文件测试并对照Hex值分析
-
音频处理知识:
- MIDI文件结构
- WAV文件格式和采样点表示
- 音频数据归一化处理
- RLE压缩算法
-
解题关键:
- 理解数据转换流程
- 逆向分析加密/压缩算法
- 实现逆向过程还原原始数据
这两道题目展示了音频处理与逆向工程的结合,需要综合运用逆向分析、动态调试和音频处理知识来解决问题。