SwampCTF Re WP
字数 1498 2025-08-30 06:50:28

SwampCTF逆向工程解题报告

概述

本文档详细分析SwampCTF中的两道逆向工程题目:"Midi Melody"和"Wamp Audio"。这两道题目都涉及音频处理相关的逆向工程,需要结合静态分析和动态调试来解决问题。

第一题:Midi Melody

题目描述

题目提供了一个MIDI音乐文件和一个可执行文件midiGenmidiGen根据输入参数生成不同的音符结果。

关键分析

  1. 文件头分析

    • 程序使用fwrite(&ptr, 0x16uLL, 1uLL, s)写入MIDI文件头
    • 写入的值包括:0x60000006468544DLL0x544DD40001000100LL0x40000006B72544DLL
  2. 参数处理

    • 输入参数只有-m-j-r三种
    • 程序从第三个参数开始处理(for ( j = 2; j < argc; ++j )
  3. 音符生成逻辑

    • 输入-mv8=0,取v14[v4]值,v4++
    • 输入-jv8=1,取v13[v4]值,v4++
    • 输入-rv8=3,取v14[0]值,v4=1
  4. 解题方法

    • 使用DFS实现爆破,每次从三个选项中选一个
    • 检查选取的4字节是否与题目给的audio.midi对应位置的4字节相同
    • 第二个参数可以随便填
  5. 密码转换

    • 生成的jmr字符序列类似摩斯密码
    • -j对应短、-m对应长、-r对应空格
    • 第一个I改成S即为flag

最终Flag

swampCTF{M1D1-WASNT-THAT-H@RD}

第二题:Wamp Audio

题目描述

题目提供了一个wamp格式的音频文件和一个wamp可执行文件,该程序将WAV文件加密为WAMP格式。

关键分析

  1. 文件处理流程

    • 使用tinywav库进行文件读写操作
    • tinywav_open_read读取输入文件
  2. 核心处理逻辑

    • 主循环处理音频数据
    • 处理2000字节的WAV数据块
    • 每两字节做除以32767.0的操作(归一化为-1到1间的浮点数)
    • 从2000字节扩充到4000字节(每个采样点用4字节浮点数表示)
  3. RLE压缩

    • sub_555555555410函数实现了RLE(游程编码)压缩
    • 存储格式:两字节一组,第一个字节是长度l,第二个字节是值v,表示连续lv
    • 压缩后补充到8000字节
  4. 解题步骤

    1. 从文件头后每8000字节一组处理
    2. 解压RLE恢复原来的4000字节(注意截断多余数据)
    3. 将4000字节浮点数转为2000字节的WORD数据
    4. 重新拼接WAV文件头
  5. 验证方法

    • 使用小WAV文件测试
    • 结合010 Editor查看Hex值
    • 实现与出题人代码类似的脚本进行对比测试

最终Flag

swampCTF{audio_formats_need_optimization}

总结与技巧

  1. 动态调试技巧

    • 对于需要参数的程序,在IDA调试时需要在Debugger选项中填写parameters
    • 复杂函数可以交给GPT初步分析,再通过动态调试确认功能
  2. 逆向思维

    • 第一题:通过少量参数测试观察生成的文件变化
    • 第二题:使用小文件测试并对照Hex值分析
  3. 音频处理知识

    • MIDI文件结构
    • WAV文件格式和采样点表示
    • 音频数据归一化处理
    • RLE压缩算法
  4. 解题关键

    • 理解数据转换流程
    • 逆向分析加密/压缩算法
    • 实现逆向过程还原原始数据

这两道题目展示了音频处理与逆向工程的结合,需要综合运用逆向分析、动态调试和音频处理知识来解决问题。

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压缩算法 解题关键 : 理解数据转换流程 逆向分析加密/压缩算法 实现逆向过程还原原始数据 这两道题目展示了音频处理与逆向工程的结合,需要综合运用逆向分析、动态调试和音频处理知识来解决问题。