地狱怪客

小试shellphish开源的driller

文章来源:http://mp.weixin.qq.com/s?__biz=MzIzMTAzODMzNQ%3D%3D&idx=1&mid=2650800366&sn=1dd2444674773199a2547f1092a8668f

2016-09-19 山地子

由于CGC的启发,最近稍微研究了一下用符号执行来辅助Fuzzing,具体能不能在常用的软件中使用还需要验证,目前只是做了一个模型测试一下,用的是shellphish团队开源的driller。这里面用到了angr,它的文档极少,有两个比较好的blog可以参考:

  1. http://ysc21.github.io/archives/
  2. https://www.praetorian.com/blog/internetwache-re60-writeup-symbolic-execution-tramples-ctf-challenge

首先是搭环境:

安装angr

  1. 安装ubuntu,我用的是16.04 x86_64版,32位应该也可以
  2. apt-get install python-dev libffi-dev build-essential python-pip git
  3. pip install angr
  4. pip install -I –no-use-wheel capstone(由于captone的兼容问题需要重装)

安装tracer

  1. git clone https://github.com/shellphish/shellphish-qemu
  2. git clone https://github.com/angr/tracer(依赖shellphish-qemu)
  3. apt-get build-dep qemu-system
  4. cd shellphish-qemu;./rebuild.sh;python setup.py install

    (需要修改shellphish-qemu中的__init__.py,注释掉17~19行)

5.  cd tracer;python setup.py install

由此环境就搭完了,写一个测试代码:

保存为vul.c,用gcc编译一下,gcc vul.c -o vul

应用tracer发现新路径,写一个test_tracer.py

如果input为“a”,则会发现vul.c中的case “b”、”z”及default三条新路径,并生成对应的输入:

如果input为”cc”(非a、b、z),则会发现3个case的路径:

如果input为”b”,则只会发现default路径:

如果input为“z”,则会发现case “b”和default两条新路径,case “a”的路径发现不了

通过以上的测试发现,在某些输入下能够找到其他所有未发现的路径,某些输入则不能,具体原因还有待研究,不过只要能够发现一条新路径即可。test_tracer.py是从driller里面抠出来的。driller的主要功能就是协助afl-fuzz,当afl-fuzz不能发现新路径时,把它变异后的input和afl-map交给driller,driller通过trace指定的input去发现afl-map中不存在的路径,发现之后生成新的input,再交给afl-fuzz去接着跑。

通过以上的实验可以知道driller的方案确实可行,当然他们已经在CGC中实战过了,这里就是验证一下。符号执行的最大问题就是路径爆炸,通过指定input,执行流也就确定了,在此基础上只需多发现一条新分支交给afl-fuzz处理就好了。

以上小试了一把driller,至于实际可用性还仍需进一步研究。下面的视频是angr简介。

码字很辛苦,转载请注明来自人生在世《小试shellphish开源的driller》

评论