二进制漏洞挖掘
作者:时尚 来源:时尚 浏览: 【大 中 小】 发布时间:2026-10-17 06:21:02 评论数:
2010年,进制Stuxnet病毒用四个Windows零日漏洞瘫痪了伊朗纳坦兹核设施的漏洞离心机。这套恶意软件不是挖掘靠钓鱼邮件骗人点击,而是进制直接攻击系统底层——它篡改了PLC控制逻辑,让离心机在正常转速和超速之间反复横跳,漏洞最终物理损坏。挖掘这件事把二进制漏洞挖掘从极客圈子的进制技术消遣,推到了国家安全层面的漏洞讨论桌上。
二进制漏洞挖掘,挖掘说直白点,进制就是漏洞在没有源代码的情况下,对着编译好的挖掘机器码找安全缺陷。你手里只有一个exe或者so文件,进制反汇编器把它翻译成汇编指令,漏洞然后你一行行读,挖掘看哪里内存没检查边界、哪里整数溢出、哪里释放后还在用。这活跟考古差不多,只不过挖的不是文物,是能让程序崩溃甚至被控制的触发点。
我见过一个CTF选手挖某款国产路由器固件的漏洞。他用Binwalk提取文件系统,发现一个CGI程序处理用户输入时用了strcpy,目标缓冲区只有64字节,但HTTP请求里的参数长度完全可控。构造一个超过64字节的payload,返回地址就被覆盖了。这漏洞说穿了不复杂,但厂商固件里藏了三年没人发现。后来他写了个PoC,远程发个HTTP请求就能拿到root shell。这种案例在IoT设备里一抓一大把,厂商把功能堆上去就发版,安全审计基本靠运气。
工具链这几年变化不小。IDA Pro还是反汇编的标杆,但Ghidra开源之后,很多人转向了它。Ghidra的反编译器能把汇编还原成接近C的伪代码,读起来省力不少。动态分析方面,AFL和它的衍生版本用覆盖率引导的模糊测试,自动生成大量输入去撞崩溃。我试过用AFL跑一个解析图片格式的库,跑了六个小时,触发了三个不同的堆溢出。但模糊测试有个问题:它只能告诉你哪里崩了,不告诉你为什么崩、能不能利用。真正的漏洞挖掘需要人脑去判断崩溃的可控性——EIP能不能被劫持、寄存器里有没有指向攻击者数据的指针。
堆漏洞比栈漏洞难搞得多。栈溢出直接覆盖返回地址就完事,堆上你得理解分配器的行为。glibc的malloc用bins管理空闲块,fastbin、smallbin、unsorted bin各有各的规则。一个off-by-one写操作可能只改掉相邻chunk的size字段,但配合unlink操作就能实现任意地址写。这种利用链的构造需要精确计算偏移,差一个字节就前功尽弃。我见过有人为了调一个堆利用,在gdb里单步跟了整整两天。
挖漏洞这事,经验比理论重要。你得知道常见的危险函数:strcpy、sprintf、gets、memcpy长度参数来自用户输入。还得熟悉编译器的保护机制:Canary、NX、ASLR、PIE,每个都有对应的绕过思路。比如ASLR在32位系统上熵很低,暴力枚举几百次就能撞对地址。64位下熵高了,但信息泄露漏洞可以配合使用。
国内做二进制挖掘的圈子不大,主要聚集在几个安全实验室和CTF战队里。360、腾讯玄武、蚂蚁光年这些团队经常在Pwn2Own上拿奖。但厂商的漏洞响应速度参差不齐,有些提交了半年没回音,有些直接回一句“设计如此”。漏洞挖掘者拿到的奖金从几百到几万美元不等,跟漏洞的严重程度和厂商的预算有关。iOS的零日漏洞在黑市上能卖到百万美元级别,但那是另一条路了。
说到底,二进制漏洞挖掘是门手艺活。工具在进步,自动化程度在提高,但核心还是人对系统底层行为的理解。一个能挖出高质量漏洞的人,脑子里得同时装着汇编指令、操作系统内存管理、编译器优化策略和攻击者的利用思路。这行没有捷径,就是大量阅读汇编、调试崩溃、构造利用,循环往复。
