家用路由器缓存区溢出漏洞分析全过程

一、 劫持执行流程实例

过程:

1.创建.c文件


2.编译生成mipsel格式的vuln_system


3.在主机上用idaPro方法打开vuln_system,将其分为两部分对其进行静态分析。如图所示黑字标注为vuln_system所代表的C语言语句



根据静态分析:

读取文件循环开始前一句:0x400610

读取文件结束0x4006D8

Ra寄存器赋值0x40077C

4.建立passwd文件

 

5.打开idaq,并在另一终端用qemu打开vuln_system等待调试

 

6.设置调试选项

 

6.按g,跳转至400610处下断点,按F9,使PC运行至断点处。sp为76FFF568,此时堆栈暂时没有数据




7.跳转至4006D8,点击代码行,按F4跳转。此时发现堆栈已被passwd中数据覆盖

 

8.跳转至0x40077C。由图可得,赋给ra寄存器存储的值,放在偏离sp指针0x1cc处。而0x194+0x38=0x1CC

可以推测,刚好是42424242,覆盖RA寄存器。

 

9.选定400788,按f4运行到目的代码。可看到RA寄存器已经被42424242覆盖。

 


10.按F8,执行到main函数结尾,崩溃现场如下:

 

二、 漏洞利用开发过程

参考资料:http://www.sohu.com/a/119183050_468740

安装idapro插件:

git clone https://github.com/devttys0/ida.git

按照readme.md提示安装

过程:

1.劫持PC

2.确定偏移

3.确定攻击途径

4.构建漏洞攻击数据:

1)输入mipsrop.stackfinders(),选取第2条指令(0x00402090)

 

(2)静态调试vuln_system,找出do_system_0起始地址


(3)编写exploit.py

 

Tips:在两次使用struct.pack时,应注意自己mips虚拟机版本。大端使用>L,小端使用<L

第一个struct.pack的填充地址为mipsrop找到地址,第二个struct.pack的填充地址为do_system_0起始地址

4)运行exploit.py,再执行vuln_system.结果如下图所示成功通过漏洞溢出控制程序

 

 


 

4. 好像没有看到对NOP区的利用(NOP sled)

5. Shellcode是机器码?

 

 

猜你喜欢

转载自blog.csdn.net/weixin_40602516/article/details/81014219
今日推荐