利用基于mips stack的溢出(rop chain)

时间:2016-09-12 23:54:00

标签: gdb mips exploit

我正在尝试开发我的第一个基于MIPS堆栈的漏洞,使用ROP链技术,运气不好......我在第一个ROP小工具上失败了,我无法弄清楚原因。我正在关注Bowcaster python框架和一些博客文章,我已经google了。由于溢出我发现允许我覆盖太少的S寄存器(仅限S0和S8),我需要跳转到一个函数结尾,它将从堆栈中设置S0-S8。我正在使用带有mipsrop插件的IDA PRO来定位小工具。我从易受攻击的二进制文件和libc中尝试过小工具,但结果相同。我在GDB中看到$ RA寄存器已正确设置为我用mipsrop选择的地址,但由于某种原因,S0-S8寄存器不会被覆盖。 ASLR在这里不是问题,因为我可以通过运行ldd几次来确认。我使用IDA PRO选择地址为000112EC的小工具,看起来像这样:(我无法发布更多图片 - 声誉)

LOAD:000112EC lw $ra, 0x48+var_4($sp)
LOAD:000112F0 lw $fp, 0x48+var_8($sp)
LOAD:000112F4 lw $s7, 0x48+var_C($sp)
LOAD:000112F8 lw $s6, 0x48+var_10($sp)
LOAD:000112FC lw $s5, 0x48+var_14($sp)
LOAD:00011300 lw $s4, 0x48+var_18($sp)
LOAD:00011304 lw $s3, 0x48+var_1C($sp)
LOAD:00011308 lw $s2, 0x48+var_20($sp)
LOAD:0001130C lw $s1, 0x48+var_24($sp)
LOAD:00011310 lw $s0, 0x48+var_28($sp)
LOAD:00011314 jr $ra
LOAD:00011318 addiu $sp, 0x48
LOAD:00011318 # End of function scandir

我已经为它添加了基本的libc地址(echo' obase = 16; ibase = 16; 2AABE000 + 112EC' | bc)并且我得到了0x2AACF2EC。作为Big Endian处理器,我发送了这样的字符串:

AAAA and the first gadget address

下面你可以看到GDB的完整输出:

GDB output after the hit

正如您所看到的,只有S0和S8被覆盖,并且没有S寄存器从堆栈中恢复。

我在这里做错了什么?请帮助:)

一些checksec.sh输出:

RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FILE
No RELRO        No canary found   NX enabled    No PIE          No RPATH   No RUNPATH   /bin/vulnbin
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FILE
Full RELRO      No canary found   NX enabled    DSO             No RPATH   No RUNPATH   /lib/libc.so.0

1 个答案:

答案 0 :(得分:0)

指令运行后有gdb输出,但在

之前(或期间)没有

您应该单步执行并使用x / wx $ sp +

手动检查每个负载

可能是你的字符串已损坏,并且s0-s7中的那些值实际上是按照你的要求从堆栈中拉出来的,你的缓冲区使用但现在已经损坏了。

另外,在新的$ ra值之后,你的溢出字符串中是否有额外的字节,或者是否终止字符串?如果它终止字符串,则s0-s7寄存器将填充垃圾堆栈数据。

底线:断点第一次加载,手动x / wx $ sp + X每次加载发生前和stepi并确认结果

如果您需要一个静态gdbserver,我可以使用各种ARM,MIPS和MIPSEL架构/ ABI @ embedded-toolkit