论坛首页 漏洞分析研究区 阅读主题

[原创]基于静态分析的路由器固件二进制漏洞挖掘经验分享

156 浏览 16 回复
#1 楼主 2026-06-01 21:09:06
这个主要是作为我个人成长经历的见证(也就是给日后的自己看的),以及和志同道合的人一起交流。
我目前已经经历了我给我自己定下的第一个计划,也就是挖到二进制漏洞并且取得cnvd证书和cve编号,算是第一个小目标,如果我有一些写错的也可以直接在下面指出。 迄今为止,在IOT方面的攻击一般分为云,管,端三个方向,云主要是关注物联网云平台的安全,管主要是通信协议的安全,而本篇文章所讨论的是在端这个方向,也就是终端设备上路由器固件的二进制漏洞挖掘经验,其中又包括堆和栈两个方面。在利用上堆比栈难了很多个数量级,但是如果仅仅只是想打出拒绝服务去cnvd拿个证书或者去拿个cve编号,其实栈和堆的难度以及手法都差不多。
本篇文章纯属技术分享和自己成长经历的证明(n年后发现自己居然还发过这种水文(乐)),由于本人只是一名大二的学生,所以目前水平还是比较浅薄,希望大家多给一点意见,目前作者自己已经挖到了一些堆和栈的漏洞,在这里做个分享。本文主要讲漏洞,对于别的加密解密和固件提取之类的模块不过多叙述。首先,不要把计算机想得太聪明,“CPU只是一个无情的状态机,它只会无情地执行指令”--南京大学蒋炎岩,所以我们在分析的过程中不能给程序加戏,比如我们分析并发的漏洞的时候,不能随意地认为计算机会保证原子性(毕竟如果原子性遭到破坏,那么并发编程就可能出问题)。但是很多时候人类就是很擅长去化简和修复一些问题,我们不知不觉就会把一些漏洞在我们大脑中修复,对于这个事情,我的解决方法是,多去怀疑,怀疑哪些地方存在漏洞,然后验证。其次,一旦想出了什么办法,立马就去实践,很多时候复现所用成本比你去推导这个办法是否正确要来的快,在挖的过程中也可以多去看看别的类型的漏洞,然后看看能不能在自己的设备上成功复现,最后,最重要的,我们在分析漏洞的时候,其实和武侠小说里的与高手过招一样,一般和高手打架,大家看到最多的就是去找这个高手的练门,也就是他的薄弱点所在。在实际应用中,我们的程序往往非常复杂,动不动就是上万行代码,我们只需要关注程序中的一些重点的代码片段,或者说程序的薄弱点,也就是对程序进行化简,去除那些无关紧要的东西,这个其实也就是和逆向是一个思想,关注分析重点,比如我们可以从危险函数入手,去分析危险函数的上下文,但是当我们决定分析一个部分的上下文时,就要仔细分析。分析危险函数是一个非常重要的步骤,因为整个路由器固件的代码量是非常大的,而且IDA分析的伪代码也比较难读,我们不可能把路由器固件的代码全部审一遍,我们就只能按照前面分析思路时说的,化繁为简,只分析整个文件最重要的部分,分析弱点,我们这里就以最常见的strcpy举例子。strcpy这个函数是我目前统计出现最多的危险函数,而且别的危险函数很多也都和strcpy差不多(比如strcat),但是并不是所有的strcpy都可以成为漏洞点,下面我将会介绍如何筛选漏洞点的方法。然后就会看到这个界面

证明你的路由器已经开始运行了,访问这个网址可以看到路由器网关页面
然后当我们运行脚本后,如果路由器挂掉了

那么就说明成功了,刷新网页也会发现网页无法访问
strcat,sprintf之类的可以向一个缓冲区拷贝数据的函数。除了分析strcpy这种危险函数之外,成为漏洞的条件一定是我们可以去控制它里面的数据,那我们控制一个程序里面数据的最好方法就是通过这个程序的输入函数来进行控制。我可以去找一些不对长度进行检验的输入函数,比如gets,scanf,以及路由器中一些名字比较像输入函数的比如websgetvar之类的函数,看看能不能去往这个函数里面输入一些东西,然后通过调试技术或者静态分析去看看这些输入都到了哪里,分析程序执行流,看看有没有什么输入可以让程序运行到奇怪的地方(等等,这好像是fuzz的原理吧,但是其实我们自己手工挖掘的时候也需要去关注),尤其是看看这个输入进入程序后有没有经过一些拷贝赋值的操作或者有没有经过一些危险函数如果你的目标只是拒绝服务,其实没啥区别。
下面给大家看看拒绝服务的条件下,栈溢出和堆溢出的反馈
这个是栈的

这个是堆的

可以发现,都差不多。
包括payload其实也都长的一样。
对于利用的话,堆会难很多,堆的利用条件比栈苛刻很多,但是如果只是想去交漏洞,那么其实拒绝服务已经可以满足需求了。当栈和堆利用成功后,其实也可以造成rce,比如,但这里我要介绍的是输入即天然的rce
给大家个例子

就比如这个地方,在下面很明显是把输入的内容直接作为终端的输入,这个时候你只需要直接输入命令即可。但是这里要注意,就是在这种情况下,拒绝服务是打不通的,而且可能程序会对你的输入进行一些限制,比如不许输入rm之类的。
但是这种很少了之前在打路由器的时候,遇到这种情况,就是在qemu页面出现很多aaaa就是把你的输入直接显示出来了,在路由器的终端,这种情况下拒绝服务是打不通的,但是确实非常天然的RCE。
比如这样,虽然看下面的代码可以很明显看出来这个是rce,但是当时我第一眼看下来就给给当拒绝服务打了(当时刚刚开始挖看到长得像拒绝服务的就直接开打,然后没有打通,后来往后面看才发现是ice,大大的输入重定向到cmdTmp.txt)

所以挖洞时要多看。比如如果分析后里面没有一个操作系统的架构,而是一些类似于这种的文件

一堆xml文件,其实这就说明这个固件是加密后的,或者binwalk根本就无法分析,也有可能是因为固件加密。
那就尝试去调试一下看看是不是有一些检查机制,一般都是死循环,只需要patch 掉那个死循环就行就行了
下面有俩文章大家可以读读,里面会写到关于patch的
Tenda-FH1201多处命令注入漏洞分析和复现
Tenda漏洞环境搭建与复现
--这个图从小火炬哔站上的的公开课上面截图的import requests

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-286055.htm
#2 2026-06-01 21:09:06
第一次发帖,记录成长,希望各位可以支持一波,谢谢各位
#3 2026-06-01 21:09:06
好文章!
#4 2026-06-01 21:09:06
好文章!
#5 2026-06-01 21:09:06
谢谢各位
#6 2026-06-01 21:09:06
很好的文章,至少适合现在的我
#7 2026-06-01 21:09:06
GotEOF


很好的文章,至少适合现在的我

哈哈哈,谢谢支持
#8 2026-06-01 21:09:06
strcpy 打shellcode试试,单单拒绝服务危害没那么高。strcpy遇到\x00会截断。


最后于 2025-9-18 14:50
被Julian__编辑

,原因:
#9 2026-06-01 21:09:06
mb_ohjamvjn


strcpy 打shellcode试试,单单拒绝服务危害没那么高。strcpy遇到\x00会截断。

这个关注点非常好,我在实习面试的时候也被问到了这个问题,strcpy遇到00截断其实方法不少,我这里有一个放应该可行,就是可以把含有00字符串的部分编码,然后程序在运行shellcode的时候解码就成,不过我目前实战并没有咋遇到过这种问题(会不会是因为我大部分都运用rop打的?),我平时也不打CTF哈哈哈,我后面写了一篇文章关于rce的,大佬可以看看3f5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6^5P5W2)9J5k6h3q4D9K9i4W2#2L8W2)9J5k6h3y4G2L8g2)9J5c8X3&6W2N6%4y4Q4x3V1j5I4y4K6M7I4y4H3`.`.
#10 2026-06-01 21:09:06
师傅问下,我现在大一上半学期快结束了,目前已经在做堆相关的ctf题了,这个速度怎么样?反正大一去打省A的ctf赛做出来1道pwn,但团队是省二等
你也给我点建议呗?是这个寒假不知道学什么?我也要向你这篇文章去试试实战吗?????
#11 2026-06-01 21:09:06
xubeining


第一次发帖,记录成长,希望各位可以支持一波,谢谢各位

师傅好,想请问师傅漏洞挖掘过程中对于设备是如何选择的呢
#12 2026-06-01 21:09:06
xubeining


这个关注点非常好,我在实习面试的时候也被问到了这个问题,strcpy遇到00截断其实方法不少,我这里有一个放应该可行,就是可以把含有00字符串的部分编码,然后程序在运行shellcode的时候解码就成 ...

感谢作者提供的思路,我在之前已经用脚本实现了对\x00进行处理(xor与加减运算方案,各有优缺点)。其实在构造rop链时可能也会遇到\x00字节,特别是mips 大端,我还是遇到过很多次。有时候不仅仅\x00会被截断,特殊字符也会被截断或转义,调试处理起来非常痛苦。
#13 2026-06-01 21:09:06
大佬牛逼,也给我了一些ai分析漏洞的思路。
#14 2026-06-01 21:09:06
MI_XI___

大佬牛逼,也给我了一些ai分析漏洞的思路。
谢谢支持哈哈哈
#15 2026-06-01 21:09:06
Julian__

感谢作者提供的思路,我在之前已经用脚本实现了对\x00进行处理(xor与加减运算方案,各有优缺点)。其实在构造rop链时可能也会遇到\x00字节,特别是mips 大端,我还是遇到过很多次。有时候不仅仅 ...
是的, 这个确实是一个问题,不过其实还有很多其他方法
#16 2026-06-01 21:09:06
mb_txxsqkju

师傅好,想请问师傅漏洞挖掘过程中对于设备是如何选择的呢
我的建议是对于新手而言可以多去看看现有的漏洞,去分析这些漏洞打出来需要绕过哪些保护机制,这样你可以大致评判你能不能挖这个设备,然后就是当你熟悉一个设备后,可以多挖几个再走,这样不用再去熟悉其他架构,但是对于大佬而言,那我就不知道他们咋挖的了,因为我是新手哈哈哈哈,上面是我的思路,可以借鉴一些
‹ 上一页 1 2 下一页 ›

请登录后参与讨论

立即登录 注册账号