对于闭源程序的反馈驱动Fuzzing,通常有3种方式:
Intel® Processor Trace (Intel® PT) 是在i5/i7 5000以上型号上加入的功能,由于它是硬件级的特性,相比Qemu或Boch,在性能上和代码工作量会占有一定优势。在Linux上可以通过perf来使用PT,可以先简单看是否支持PT:
查看是否支持PT:
ls /sys/devices/intel_pt/format
追踪程序执行:
perf record -e intel_pt// program
也可以使用开源工具simple-pt(https://github.com/andikleen/simple-pt)中的ptfeature命令行工具来检测:
./ptfeature pt
Supports PT
最新版GDB也支持pt功能了:
gdb program
start
record btrace pt
contrecord instruction-history /m # show instructions
record function-history # show functions executed
在程序内通过perf_event_open函数可以使用PT实现BB基本块的覆盖率追踪,传递给指定进程pid来实现监控:
将返回的文件描述符传递给mmap映射为可读写的用户内存空间,以便从中读取PT记录的追踪数据:
PT记录的追踪数据采用压缩的二进制格式输出,每秒每个CPU都会持续记录并输出,由于是硬件记录的,最早自然是出现在内核空间,为了使用它,就需要将其导出到用户空间,即通过前面mmap方法映射到用户可写的内存空间,然后再去定位数据解码。PT导出的追踪数据被存储在一个叫AUX space
的内存区域,它相对perfMmapBuf
的偏移记录在perf_event_mmap_page->aux_offset
,大小为perf_event_mmap_page->aux_size
,上面代码的第二步mmap
就是去映射AUX space
。
接下来就是利用libpt来解码捕获到追踪数据,实现函数位于perf_ptAnalyzePkt中: