LitCTF2025 re wp
字数 1748 2025-08-26 22:11:35
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:
LILCTF{6e_VIg1L@NT_46ainSt_pH1$HlN9}
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源码:恢复符号参考