快捷搜索:  网络  渗透  后门  CVE  扫描  木马  黑客  as

PTFuzzer:一个基于硬件加速的二进制程序Fuzz工具

简介

PTFuzzer是基于AFL框架完成的一款开源fuzz工具,它采用了Intel Processor Trace硬件部件来网络程序执行的路径信息,改进了原来AFL通过编译插桩方式获取程序执行路径信息的要领。以及AFL相比,硬件网络的路径信息愈加丰富,同时可以直接对目标程序进行fuzz,无需源码支持。

手艺违景

1.1 AFL

Fuzz(也鸣模胡测试)是自动化挖掘软件漏洞的一种有用要领。基于反馈的fuzz手艺是目前学术界以及工业界的研究热门,而其中的代表就是AFL。然则AFL存在一个问题,即需要对被测试的程序进行编译插桩后才能fuzz。这也象征着必须要有目标程序的源代码,而且必须是C代码才行。AFL的Qemu模式采用动态二进制翻译的手段获取反馈信息,然则这类基于摹拟仿真的要领开销太大(5倍以上的开销很常见),基本上不实用。

1.2 Intel Processor Trace

Intel Processor Trace(PT)是Intel在其第五代CPU以后引入的一个硬件部件。该硬件部件的作用是记录程序执行中的分支信息,从而帮助构建程序运行过程中的控制流图。在默认情形下CPU的PT部件是处于关闭状态,这象征着CPU不会记录程序的分支信息,因此也不会产生任何开销。通过写MSR寄存器可以关上PT开关。在关上PT开关后,CPU最先记录分支指令信息,所记录的信息以压缩数据包的情势存储在内存中。由于分支信息记录完全由硬件实现,因此开销无比小,一般在5%下列,这个开销对于大多数应用来讲基本上可以忽稍不计。PT部件最初被设计用来重构程序的控制流图,目的是为了帮助调试以及阐发。最早行使PT做fuzz的工具是kAFL,其效果发表在安全领域的四大顶级学术会议之一的USENIX Security上。然则kAFL是一个针对内核的fuzz工具,而PTFuzzer是针对应用程序的fuzz工具,这两者的设计会有很多不同。

特点以及制约

2.1特点

PTFuzzer最大的特点是不需要目标程序有源码,这在很多要领是无比有效的。起首,对于很多闭源程序的测试颇有优势。例如,某公司对外公布了一个二进制程序的发行版。这时辰拿不到程序的源代码用AFL就没法测试,而用PTFuzzer就可以。另外,即便是对于一些有源码的程序,可能由于其编译环境极为复杂,用AFL来进行编译插桩变得无比繁琐以及耗时,无意也会出现不成功的情形。还有一种情形是对于那些非C说话编写的二进制程序,AFL就无能为力了。例如本人在测试pandoc程序时,发现pandoc是用Haskell说话编写的。这时辰用AFL就没法进行编译插桩,而使用PTFuzzer进行测试,只要要简单通过apt-get装置一个pandoc可执行程序就OK了。

2.2 制约

目前PTFuzzer只支持Linux操作体系,并且请求Linux内核的版本最少是4.13.0. 我们测试过Ubuntu16.04.4以及Ubuntu17.10,都是没有问题的。另外,因为使用了PT硬件部件,PTFuzzer请求5代以上的CPU。

使用要领

3.1 从github上下载源码

git clone https://github.com/hunter-ht-2018/ptfuzzer.git

3.2 编译装置

编译之前先装置依靠项,ptfuzzer依靠的程序以及库包括python,capstone,cle和msr-tools。在源码目录下有个check_dep.sh脚本,可以直接运行装置这些依靠项。Ptfuzzer采用CMake编译:

cd ptfuzzer/
mkdir build
cd build
cmake ../ -DPREFIX=.
make
make install

以上命令会在build目录下生成bin目录,其中包括了运行ptfuzzer所需的所有程序。afl-ptfuzz:核心fuzz二进制程序ptfuzzer.py:对alf-ptfuzz的python封装,首要用来处理参数,解析目标二进制程序。

3.3 运行

在运行之前需要关上一些开关,这个以及AFL是相同的,可以通过运行config-run.sh来完成。以测试pandoc程序为例,起首装置

pandoc:apt install pandoc

然后预备一个docx的种子放入in_dir中,最后运行ptfuzzer最先测试:

sudo python ./bin/ptfuzzer.py "-i ./in_dir -o ./out_dir" "/usr/bin/pandoc -f docx -t html" 

运行状态如图所示:

fuzz_pandoc.png

注意:运行ptfuzzer需要root权限。

3.4 参数设置

ptfuzzer有一些运行时参数可以设置,这些参数包括:BRANCH_MODE,MEM_LIMIT,PERF_AUX_BUFFER_SIZE

其中BRANCH_MODE是指分支网络模式,其值可以是TIP_MODE或者TNT_MODE。要是采用TIP_MODE,那么ptfuzzer只解析PT网络到的TIP包(通常是非前提跳转),要是采用TNT_MODE,则不但解析TIP包,而且解析TNT包(前提跳转)。TNT_MODE愈加精确,开销也较大一些。默认情形下ptfuzzer采用TNT_MODE。

MEM_LIMIT是只目标测试程序的最大内存制约,单位为MB。这个至关于AFL的-m参数。要是目标程序由于使用了太大的内存而不能运行,需要考虑增大MEM_LIMIT的配置。

PERF_AUX_BUFFER_SIZE是指存储PT数据包的缓存大小,网络黑客,单位为MB。要是目标程序一次运行时间太长,可能会产生特别多的分支跳转信息,导致缓存不够,这时辰可以考虑增大PERF_AUX_BUFFER_SIZE的配置。在当前运行目录

下编辑一个ptfuzzer.conf的文件可以设置这些参数,参考情势为:

#BRANCH_MODE=TNT_MODE
BRANCH_MODE=TIP_MODE
MEM_LIMIT=100            # afl -m argument
PERF_AUX_BUFFER_SIZE=32  # the size of buffer used to store PT packets.

总结

PTFuzzer采用Intel CPU最新的PT部件来网络分支信息,解决了AFL需要源码支持的问题,能够方面的挖掘Linux中的二进制程序漏洞

*

您可能还会对下面的文章感兴趣: