Windows下闭源fuzz的简单记录
前言
最近我使用动、静态分析加闭源fuzz在企鹅的产品挖到了多个二进制漏洞,在这简单记录部分所得。
简介
众所周知,闭源fuzz有几个主要难点:
- 路径反馈-提高fuzz效率
- 漏洞检测机制-检测堆漏洞
- 无源码
本文将非常简单的说明怎么试图缓解。
路径反馈
我的做法很简单,直接拿别人的开箱就用得了,比如说:
漏洞检测机制
一般windows程序都开启了GS保护,可以用这个来检测栈溢出漏洞,但是堆内存漏洞就比较难检测,那我们该怎么办呢?在这,我们可以使用完全页堆机制来缓解检测堆内存漏洞,为什么说是缓解?因为开启页堆机制会让fuzz效率大大的下降!
-
什么是完全页堆机制?
- 分配的内存都在内存页的边界。
- 完全页堆可以在每个分配的内存块前后添加“守卫页”(Guard Pages),这些守卫页在被访问时会导致程序异常,从而帮助识别内存访问错误。
- 当启用完全页堆时,每次内存释放操作后,相应的内存区域会被标记为不可访问或填充特殊的模式,从而在后续非法访问时触发异常或明显的程序错误。
-
为什么完全页堆机制影响程序运行效率?
- 因为每次分配的内存都要以这种页面边界布局,尤其对于小片的内存分配,即使分配一个字节,也要分配一个内存页,和一个保留的虚拟内存页。这就需要大量的内存,从而影响了程序效率。
-
如何开启完全页堆机制?
对要fuzz的程序以管理员权限执行:
gflags.exe /i <target_executable> +hpa
即可
无源码
无源码怎么找到要fuzz的函数?答案就是我们pwn
题目的入门题的技巧,IDA
里使用搜索字符串。这样我们就可以试图通过日志函数快速判断部分函数的功能,甚至,在github
或google
上找到源码。