PWN题执行system(binsh)错误
PWN题执行system(“/bin/sh”)错误
sub rsp, qword ptr [rip + 0x14b45] <0x7ffff7ffc708
在system函数plt的时候会去寻找对应的地址,这里我们需要在栈顶上留出足够的空间去让其寻找地址,所以在我们栈迁移去bss段的时候应把bss段的地址写到靠后一点,否则sub减掉后值是无法访问的,
错误/image-20230915143057958.png)
movaps xmmword ptr [rsp + 0x50], xmm0
在do_system函数偏移357的位置有个movaps的汇编,在执行这里的时候如果RSP的栈对齐错误的话是无法成功执行的,于是我们需要考虑堆栈对齐的问题,这时候rsp的值加或者减八即可
错误/image-20230915143352618.png)
是xmm寄存器的问题,当glibc版本大于2.27的时候,系统调用system(“/bin/sh”)之前有个xmm寄存器使用。要确保rsp是与16对齐的,也就是末尾必须是0.
mov dword ptr [esp + 8], eax
错误/image-20231227110900594.png)
这种只要是涉及到了esp或者rsp寻址的问题的基本上都是栈空间不足的问题,这个题我是用的栈迁移做的,所以我把栈迁移到bss距离较远的地方即可
错误/image-20231227111146839.png)
execve参数不为0
这种时候往往是程序的栈崩溃了,如果可以的话,我们可以直接打syscall的execve执行,或者说换个方法执行
环境变量被覆盖
我把栈地址修改成0x804b100
,执行system("/bin/sh")
是失败的,然后再和大佬的讨论中发现了几种可能,system需要获取系统的环境变量envp,通过看system的源代码,发现有一个全局指针变量_environ
指向栈上的envp,如果这个值被覆盖成了一个无效的地址,system则无法执行。但是在该题中,我的第一个rop并不长,所以并没有覆盖掉envp,之后修改了栈地址,也不存在覆盖envp的情况。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Daily Study!