内容简介:对于一些复合文件格式,如果只是单纯的暴力Fuzzing,会导致生成很多无法被解析的文件,因此需要对文件变异作一些定制化的工作,比如docx、doc等office复合文件,docx是个压缩包,doc是个OLE格式,如果fuzz docx自然需要将其zip解压,再针对感兴趣的文件作变异,对于doc最好是作文件格式解析,只对感兴趣的stream作文件变异,这样的fuzzing的有效性才会更高。庆幸地是,honggfuzz提供
对于一些复合文件格式,如果只是单纯的暴力Fuzzing,会导致生成很多无法被解析的文件,因此需要对文件变异作一些定制化的工作,比如docx、doc等office复合文件,docx是个压缩包,doc是个OLE格式,如果fuzz docx自然需要将其zip解压,再针对感兴趣的文件作变异,对于doc最好是作文件格式解析,只对感兴趣的stream作文件变异,这样的fuzzing的有效性才会更高。
庆幸地是,honggfuzz提供 -c
参数用于扩展变异规则以代替原有变异方式,同时提供有 --pprocess_cmd
在原有的文件变异后再作处理:
--mutate_cmd|-c VALUE External command producing fuzz files (instead of internal mutators) --pprocess_cmd VALUE External command postprocessing files produced by internal mutators
-c
功能比较有用,也是我用得比较多的,另一个 --pprocess_cmd
基本我没用过。
当你通过 -f
提供输入样本目录后,在fuzzing时,随机提取的文件会直接传递给 -c
参数指定的扩展命令作变异。
比如想针对某文件特定offset范围内的内容进行变异,下面是针对macOS/iOS字体文件中的虚拟指令作Fuzzing时写的脚本:
#!/usr/bin/env python import mmap import os from random import randint import sys RANGE_START = 0x16D8 RANGE_END = 0x304D MIN_BYTES_TO_FLIP = 1 MAX_BYTES_TO_FLIP = 5 if ".DS_Store" in sys.argv[1]: exit(1) with open(sys.argv[1], "r+b") as f: mapped = mmap.mmap(f.fileno(), 0) #print "file size: 0x%x" % len(mapped) bytes_to_flip = randint(MIN_BYTES_TO_FLIP, MAX_BYTES_TO_FLIP) bytes_flipped = 0 while bytes_flipped < bytes_to_flip: byte_pos = randint(RANGE_START, RANGE_END) #print "byte_pos: 0x%x" %byte_pos byte_new = chr(randint(0, 255)) mapped[byte_pos] = byte_new bytes_flipped += 1 mapped.close()
变异效果:
最后挖到一个TTF字体虚拟指令漏洞:
orig file: 2F90h: 00 3F C5 CD 2B 10 C1 10 DE 3F C5 【CD】 2B 10 C5 10 poc file: 2F90h: 00 3F C5 CD 2B 10 C1 10 DE 3F C5 【DD】 2B 10 C5 10 glyf table -> SimpleGlyf[] -> Instructions('0xCD' => ‘0xDD') -> MDRP指令
同样的,你也可以写个doc、docx等office文件格式解析并变异的扩展fuzzer,比如利用olefile库(但只支持修改同等大小不变的doc,要插入或删除需要自行实现),或者通过COM接口来实现操作。
比如之前有段时间doc中的公式编辑器存在很多漏洞,你就可以专门针对 Equation Native
流作fuzzing。
最后放两张图(riufuzz是自己对honggfuzz二次开发的版本,后面有机会再讲):
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Bochspwn漏洞挖掘技术深究(1):Double Fetches 检测
- Java 反序列化深究
- 一次深究 Bug 根源的案例
- 深究SQLAlchemy中的表关系 Table Relationships
- 密码学技术何以为信?深究背后的计算困难性理论
- 如何做好漏洞管理的漏洞修复工作
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python网络编程(第3版)
[美] Brandon Rhodes、[美] John Goerzen / 诸豪文 / 人民邮电出版社 / 2016-9 / 79.00元
本书针对想要深入理解使用Python来解决网络相关问题或是构建网络应用程序的技术人员,结合实例讲解了网络协议、网络数据及错误、电子邮件、服务器架构和HTTP及Web应用程序等经典话题。具体内容包括:全面介绍Python3中最新提供的SSL支持,异步I/O循环的编写,用Flask框架在Python代码中配置URL,跨站脚本以及跨站请求伪造攻击网站的原理及保护方法,等等。一起来看看 《Python网络编程(第3版)》 这本书的介绍吧!