我正在尝试开发我的第一个基于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的完整输出:
正如您所看到的,只有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
答案 0 :(得分:0)
指令运行后有gdb输出,但在
之前(或期间)没有您应该单步执行并使用x / wx $ sp +
手动检查每个负载可能是你的字符串已损坏,并且s0-s7中的那些值实际上是按照你的要求从堆栈中拉出来的,你的缓冲区使用但现在已经损坏了。
另外,在新的$ ra值之后,你的溢出字符串中是否有额外的字节,或者是否终止字符串?如果它终止字符串,则s0-s7寄存器将填充垃圾堆栈数据。
底线:断点第一次加载,手动x / wx $ sp + X每次加载发生前和stepi并确认结果
如果您需要一个静态gdbserver,我可以使用各种ARM,MIPS和MIPSEL架构/ ABI @ embedded-toolkit