LitCTF2025 re wp
字数 1748 2025-08-26 22:11:35

LitCTF2025 Reverse Engineering Writeup 教学文档

1. ARM ASM 逆向分析

1.1 题目概述

  • 题目提供一个APK文件,核心校验逻辑在native层
  • 采用三层加密机制:
    1. 字节查表重排与按位异或
    2. 单个字节循环右移(ROR)
    3. 自定义换表Base64编码

1.2 分析步骤

  1. 初步分析

    • 使用IDA Pro分析so文件
    • 发现严重混淆,包含大量重复花指令
    • 根据题目提示,采用动态调试跟踪输入flag
  2. 关键信息获取

    • 通过测试确定flag长度为40字节
    • 动态调试确认核心逻辑在第一个call r8指令中
    • 深入分析sub_7FF69B8EAA70sub_7FF69B8E7930函数
  3. 调试技巧

    • 在获取输入后设置内存断点
    • 通过F8单步执行,观察程序反应定位核心代码
    • call rdx处实际计算输入长度
    • 当RDI为0xB4时程序会退出,此时开始单步跟踪
  4. 加密流程

    • encode1: 查表重排与异或
    • encode2: 使用动调获取的随机数值与密文
    • 最终通过memcmp比较加密结果

2. 混淆处理技术

2.1 混淆特征

  • 文件obfusheader.h包含严重混淆代码
  • 大量重复花指令干扰静态分析

2.2 应对策略

  1. 动态调试优先

    • 通过实际执行路径分析真实逻辑
    • 关注内存访问和寄存器变化
  2. 关键点定位

    • 跟踪flag输入处理流程
    • 关注加密函数调用前后的数据变化
  3. 内存断点技巧

    • 在flag缓冲区设置断点
    • 观察加密过程中的数据修改

3. 1'M no7 A rO6oT 分析

3.1 文件分析

  • 发现脚本下载并执行HOST/Coloringoutomic_Host.mp3
  • 010 Editor分析显示HTA程序特征

3.2 提取与解密

  1. HTA代码提取

    • 从文件中分离出HTA脚本
    • 分析发现JavaScript自解码执行机制
  2. 混淆技术

    • XOR/Hex双重混淆
    • 动态执行脚本技术
  3. 进一步分析

    • 发现访问http://challenge.xinshi.fun:30243/bestudding.jpg
    • 实际下载PowerShell高度混淆脚本
  4. 解密方法

    • 保存为.ps1文件
    • 将执行代码$r改为Write-Output输出而不执行
    • 运行获取解密后内容
  5. 最终flag

    LILCTF{6e_VIg1L@NT_46ainSt_pH1$HlN9}
    

4. Oh_My_Uboot 分析

4.1 文件特征

  • 提供uboot文件,符号被剥离
  • 使用自定义加密方案

4.2 分析方法

  1. 符号恢复

    • 从u-boot源码编译带符号版本
    • 使用Bindiff对比定位关键函数
  2. 加密算法

    • 异或0x72操作
    • 自定义换表Base58编码
    • 编码表:0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_\abcdefghi`
  3. 关键函数

    • 定位到main_loop函数
    • 分析加密处理流程

5. Qt_Creator 分析

5.1 程序特征

  • Qt编写的桌面程序
  • 包含反调试机制

5.2 逆向步骤

  1. 反调试处理

    • 使用IDA定位反调试代码
    • 直接NOP掉反调试检查
  2. 关键函数定位

    • 注册器常用QLineEdit::text函数
    • 在导出表中查找并下断点
    • 跟踪调用该函数的位置
  3. flag提取

    • 分析调用上下文
    • 从内存中直接提取flag

6. 总结与技巧

6.1 通用逆向技巧

  1. 动态调试优先

    • 对于混淆严重的代码,动调比静态分析更有效
    • 关注输入处理流程和内存变化
  2. 关键点定位

    • 输入/输出函数调用
    • 加密/解密函数调用
    • 比较函数(memcmp等)
  3. 加密算法识别

    • 观察数据变换模式
    • 识别常见加密特征(查表、置换、异或等)

6.2 CTF特定技巧

  1. 长度测试

    • 通过尝试不同长度输入确定flag长度
    • 观察程序对不同长度输入的反应
  2. 内存分析

    • 在关键点设置内存断点
    • 跟踪加密中间结果
  3. 脚本处理

    • 对于混淆脚本,采用安全方式提取内容
    • 修改执行逻辑为输出逻辑避免风险

6.3 工具链推荐

  • IDA Pro + Hex-Rays:主逆向工具
  • Bindiff:二进制对比
  • 010 Editor:文件分析
  • PowerShell/VSCode:脚本分析
  • U-Boot源码:恢复符号参考
LitCTF2025 Reverse Engineering Writeup 教学文档 1. ARM ASM 逆向分析 1.1 题目概述 题目提供一个APK文件,核心校验逻辑在native层 采用三层加密机制: 字节查表重排与按位异或 单个字节循环右移(ROR) 自定义换表Base64编码 1.2 分析步骤 初步分析 : 使用IDA Pro分析so文件 发现严重混淆,包含大量重复花指令 根据题目提示,采用动态调试跟踪输入flag 关键信息获取 : 通过测试确定flag长度为40字节 动态调试确认核心逻辑在第一个 call r8 指令中 深入分析 sub_7FF69B8EAA70 和 sub_7FF69B8E7930 函数 调试技巧 : 在获取输入后设置内存断点 通过F8单步执行,观察程序反应定位核心代码 call rdx 处实际计算输入长度 当RDI为0xB4时程序会退出,此时开始单步跟踪 加密流程 : encode1: 查表重排与异或 encode2: 使用动调获取的随机数值与密文 最终通过memcmp比较加密结果 2. 混淆处理技术 2.1 混淆特征 文件 obfusheader.h 包含严重混淆代码 大量重复花指令干扰静态分析 2.2 应对策略 动态调试优先 : 通过实际执行路径分析真实逻辑 关注内存访问和寄存器变化 关键点定位 : 跟踪flag输入处理流程 关注加密函数调用前后的数据变化 内存断点技巧 : 在flag缓冲区设置断点 观察加密过程中的数据修改 3. 1'M no7 A rO6oT 分析 3.1 文件分析 发现脚本下载并执行 HOST/Coloringoutomic_Host.mp3 010 Editor分析显示HTA程序特征 3.2 提取与解密 HTA代码提取 : 从文件中分离出HTA脚本 分析发现JavaScript自解码执行机制 混淆技术 : XOR/Hex双重混淆 动态执行脚本技术 进一步分析 : 发现访问 http://challenge.xinshi.fun:30243/bestudding.jpg 实际下载PowerShell高度混淆脚本 解密方法 : 保存为.ps1文件 将执行代码 $r 改为 Write-Output 输出而不执行 运行获取解密后内容 最终flag : 4. Oh_ My_ Uboot 分析 4.1 文件特征 提供uboot文件,符号被剥离 使用自定义加密方案 4.2 分析方法 符号恢复 : 从u-boot源码编译带符号版本 使用Bindiff对比定位关键函数 加密算法 : 异或0x72操作 自定义换表Base58编码 编码表: 0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_\ abcdefghi ` 关键函数 : 定位到 main_loop 函数 分析加密处理流程 5. Qt_ Creator 分析 5.1 程序特征 Qt编写的桌面程序 包含反调试机制 5.2 逆向步骤 反调试处理 : 使用IDA定位反调试代码 直接NOP掉反调试检查 关键函数定位 : 注册器常用 QLineEdit::text 函数 在导出表中查找并下断点 跟踪调用该函数的位置 flag提取 : 分析调用上下文 从内存中直接提取flag 6. 总结与技巧 6.1 通用逆向技巧 动态调试优先 : 对于混淆严重的代码,动调比静态分析更有效 关注输入处理流程和内存变化 关键点定位 : 输入/输出函数调用 加密/解密函数调用 比较函数(memcmp等) 加密算法识别 : 观察数据变换模式 识别常见加密特征(查表、置换、异或等) 6.2 CTF特定技巧 长度测试 : 通过尝试不同长度输入确定flag长度 观察程序对不同长度输入的反应 内存分析 : 在关键点设置内存断点 跟踪加密中间结果 脚本处理 : 对于混淆脚本,采用安全方式提取内容 修改执行逻辑为输出逻辑避免风险 6.3 工具链推荐 IDA Pro + Hex-Rays:主逆向工具 Bindiff:二进制对比 010 Editor:文件分析 PowerShell/VSCode:脚本分析 U-Boot源码:恢复符号参考