概要
漏洞利用开发过程
由上图可以知道,漏洞利用开发过程需要遵循以下步骤:
1.劫持PC
2.计算偏移
3.确定攻击途径
4.构建漏洞攻击途径
劫持PC
输入命令等待调试:
打开IDA附加远程进程,按F9键执行程序,程序立即崩溃,可以看出缓冲区已经溢出,此时,我们已经劫持PC.
计算偏移
在劫持PC之后,我们需要计算使用多少个字节可以使PC指向我们所期望的地址,这里使用两种方法确定偏移,其他方法大同小异:
大型字符串脚本
建立大型字符串脚本,在这些字符中任意取连续4位,这4个 字符在字符集中是唯一的,找出覆盖 到PC的4个字符在字符集中的偏移,就可以实现精确定位:
(注:貌似按照书上所说的利用patternLocOffset.py脚本生成不了==!,可能作者笔误写错了吧~~)
而后利用IDA进行附加调试,崩溃现场如图所示:
由图可以知道,劫持PC的位置在0x6E37416E,即字符串“n7An”,继续使用下面的指令搜索该 劫持PC的字符串的精确 偏移;
可以看到,填充412(0x19C)字节后可以精确劫持PC;
为类验证该值是否正确,可以构造 一个偏移数据进行测试,如下:
毫无悬念,我们成功地劫持了pc,使其指向0x42424242(BBBB)处,崩溃现场如下所示:
栈帧分析
在了解了MIPS的体系 结构堆栈布局的情况下,可以通过调用栈布局结合动态调试来确定偏移.
从buf到$ra的偏移计算如下:
offset = save_ra - buf_addr =-0x4 + 0x1A0 = 0x19c
一般漏洞攻击的途径有两种:一是命令执行,另外一种方法是执行shellcode;
这里只谈命令执行的方法:
在源程序里面有一个函数do_system_0.虽然从代码里面可以看出,do_system_0函数只能执行“ls -l”命令,但是我们可以构造一条ROP链,通过溢出漏洞调用这个函数,使得这个函数能够执行任意命令.想要构造出ROP链,首先构造出do_system_0这个函数的两个参数,将两个参数分别 装入寄存器
a0和a1,这里只需要控制寄存器$a1即可,该参数是命令的字符串地址,如下所示:
这里使用mipsrop.py搜索构造 合适的ROP链,使用如下命令:
测试
这里我使用了三个命令进行测试,发现通过漏洞溢出控制程序以后,是可以执行刚才那三个命令的!发现可以成功的利用漏洞!(后来笔者发现上面这幅图是有问题的)
上面这幅图是正确的利用结果.