Fuzzing Like A Caveman 2: Improving Performance学习笔记
Analyzing Our Fuzzer
用python3 -m cProfile -s cumtime JPEGfuzzer.py Canon_40D.jpg查看每个部分使用的时间
1 | |
其中输出每列的具体解释如下:
-
ncalls:表示函数调用的次数;
-
tottime:表示指定函数的总的运行时间,除掉函数中调用子函数的运行时间;
-
percall:(第一个percall)等于*tottime/ncalls;
-
cumtime:表示该函数及其所有子函数的调用运行的时间,即函数开始调用到返回的时间;
-
percall:(第二个percall)即函数运行一次的平均时间,等于cumtime/ncalls;
-
filename:lineno(function):每个函数调用的具体信息
从上面可以看到exif函数花的时间很多,exif里面调用了run,而run调用了大量的pty模块花费了大量时间,现在把run改成subprocess模块的Popen再看看消耗的时间
1 | |
Popen的使用方法https://www.jb51.net/article/133941.htm
p.returncode
子进程的退出状态码,通常来说,一个为 0 的退出码表示进程运行正常。
一个负值-N表示子进程被信号N中断 (linux输入kill -l就能看到)。
1 | |
可以发现速度明显快了很多
Improving Further in Python
然后将迭代次数改成5000次,然后再看看性能如何
1 | |
我的程序跑出来还行,不管了,文章说要改bit_flip,那就改吧,改的话那就将减少类型转换
1 | |
然后bit_flip就快了一倍时间
1 | |
New Fuzzer in C++
1 | |
bit_flip改写成C++
1 | |
create_new()改写成C++
1 | |
exif改写成C++
1 | |
magic改写C++
1 | |
main()
1 | |
AFL创始人的改进方案
这是作者的代码
1 | |
lcamtuf说不要使用popen,因为这样会产生一个shell再去执行二进制程序有性能的损失,下面是作者的改进代码:
1 | |
wait获取子进程退出状态 WIFEXITED和WIFSIGNALED用法
这方面还是不熟,可以看看https://blog.csdn.net/y396397735/article/details/53769865