PWN to MIPS by the ROP

一个MIPS架构大端小程序,先checksec,没发现有金丝雀保护机制,可以用来栈溢出,用IDA分析一下,首先需要猜解一些字符串,限时三秒全部猜对后才会来到漏洞利用点:

sub_401070函数就是用来计算猜解时间差的,而sub_400B38函数就是造成栈溢出漏洞的地方:

进入sub_400B38函数,由于需要把1024个字节内容存放到v12代表的栈空间里:

这里由于v12只能合理存放28个字节内容,对于1024个字节来说是超过了存放空间,所以会造成栈溢出:

继续翻看汇编代码,发现存在system调用,参数还是/bin/sh,一般来说通过栈溢出把ra寄存器覆盖为0x400a98就可以直接利用成功,但是sub_400B38函数里遇到0a会停止读取,而0x400a98就包含0a,所以不可以直接利用,需要用到ROP技术来曲折调用:

在__libc_csu_init函数里就存在一块完美的构造ROP利用点的地方,一般先跳到蓝线圈起来的地方,再跳到红线圈起来的地方,32位mips函数调用传参前三个a0,a1,a2都可以完全控制,想调用的函数也可以自己设置,在jalr $t9调用完成后可以再次进入蓝圈,这又可以重复上面的步骤:

这里由于ELF文件的延迟绑定机制,在system函数没有被调用过的时候,GOT表中就不会写入system函数的实际地址,所以这里构造ROP先调用alarm函数,这个函数调用过程中对其他参数影响很小,在执行流再次进入蓝圈的时候调用plt中的system就可以成功利用了:

PWN成功后如下:


你可能感兴趣的:(PWN to MIPS by the ROP)