Token capture via an llvm-based analysis pass
引言
三年前,LLVM框架因其模块化设计和多领域应用潜力引起了我的兴趣。这个工业级编译器技术集合支持代码优化、混淆、静态插桩、静态分析等多种功能。其强大之处在于允许开发者在三个主要阶段(前端、中端、后端)插入自定义代码。
背景
受AFL(American Fuzzy Lop)模糊测试工具的启发,本文实现了一个LLVM pass来自动化生成fuzzing字典。传统方法(afl-tokencap)需要运行时捕获,而我们的解决方案在编译时完成。
实现细节
AFLTokenCap类
这个BasicBlockPass子类遍历LLVM中间表示(IR),寻找特定函数调用(如strcmp、memcmp)中的常量参数:
|
|
硬编码字符串检测
通过分析llvm::ConstantDataArray来识别硬编码字符串:
|
|
整数立即数捕获
扩展功能以识别比较指令和switch语句中的ASCII常量:
|
|
应用示例
在libpng、sqlite3和libxml2上的测试结果:
|
|
局限性
- 会捕获测试代码中的常量
- 通过排除main函数减少噪声
- 性能影响约0.3秒(以libpng为例)
结论
这个不足400行的LLVM pass实现了编译时字典生成,兼容AFL和libFuzzer。欢迎读者在自己的项目上测试并反馈效果。