一、 劫持执行流程实例
过程:
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是机器码?