污点分析工具——libdft64
libdft64 简介
libdft64 一款基于 Intel Pin 开发的动态污点分析工具。
1. 污点分析
污点分析(Taint Analysis)是一种跟踪并分析污点信息(通常指程序接受的外部输入)在程序中流动的技术。污点分析过程通常包括三个步骤:
- 识别并标记污点源(Source)
- 跟踪污点在程序中的传播(propagation)
- 在关键的程序点(Sink)检测是否受到污点的影响
动态污点分析(Dynamic Taint Analysis, DTA)是一种用于确定在程序运行时,运行环境中哪些寄存器和内存区域,可以由外部输入来进行控制的技术。
动态污点分析与静态污点分析的主要区别在于,静态污点分析是模拟程序运行,而动态污点分析需要实际运行程序。动态污点分析的优缺点为:
- 优点:误报率较低,检测结果的可信度较高。
- 缺点:
- 漏报率较高:由程序动态运行时的代码覆盖率决定
- 平台相关性较高:特定的动态污点分析工具只能够解决在特定平台上运行的程序
- 资源消耗大:包括空间复杂度和时间复杂度
2. Intel Pin
Intel Pin 是一个动态二进制插桩(Dynamic Binary Instrumentation, DBI)框架,由英特尔公司开发。它允许用户在程序运行时(即不需要源代码)对程序的二进制代码进行插桩和分析。
Intel Pin 提供了丰富的 API 库,供开发者编写和构建自己的 Pintool,用来完成特定的分析任务。
libdft64 安装和使用
1. 安装和构建
libdft64 是一款开源工具,它依赖于 Intel Pin。使用时需要下载源码,安装依赖,执行构建:
1 | git clone https://github.com/AngoraFuzzer/libdft64.git |
2. 示例解析
(1) 使用演示
libdft64 给出的示例用法如下:
1 | cd tools |
执行结果为:
(2) 源码解读
libdft64 测试对象的源码为mini_test.cpp
。在main
函数中,调用一些自定义的函数(__libdft_set_taint
, __libdft_get_taint
, __libdft_getval_taint
),来进行污点数据的设置和获取操作。
1 | int main(int argc, char **argv) { |
使用 libdft64 进行污点追踪的代码为 track.cpp
。通过 Intel Pin 的 API 函数RTN_FindByName
来定位 mini_test.cpp
中的函数 (__libdft_set_taint
, __libdft_get_taint
, __libdft_getval_taint
),并通过 Intel Pin 的 API 函数RTN_InsertCall
来对这些定位到的函数进行插桩。当运行到目标函数时,会调用相应的 handler 函数 (TestSetHandler
, TestGetHandler
, TestGetValHandler
) 执行额外操作。
1 | VOID TestGetHandler(void *p) { |
根据 Intel Pin 的 API 手册,RTN_InsertCall
原型为:
1 | VOID RTN_InsertCall ( |
根据官方示例,不难发现,使用 libdft64 的主要步骤为:定位目标函数 -> 对目标函数进行插桩 -> 在插桩的 handler 函数中实现分析需求。