PWN题执行system(“/bin/sh”)错误

sub rsp, qword ptr [rip + 0x14b45] <0x7ffff7ffc708

在system函数plt的时候会去寻找对应的地址,这里我们需要在栈顶上留出足够的空间去让其寻找地址,所以在我们栈迁移去bss段的时候应把bss段的地址写到靠后一点,否则sub减掉后值是无法访问的,

image-20230915143057958错误/image-20230915143057958.png)

movaps xmmword ptr [rsp + 0x50], xmm0

在do_system函数偏移357的位置有个movaps的汇编,在执行这里的时候如果RSP的栈对齐错误的话是无法成功执行的,于是我们需要考虑堆栈对齐的问题,这时候rsp的值加或者减八即可

image-20230915143352618错误/image-20230915143352618.png)

是xmm寄存器的问题,当glibc版本大于2.27的时候,系统调用system(“/bin/sh”)之前有个xmm寄存器使用。要确保rsp是与16对齐的,也就是末尾必须是0.

mov dword ptr [esp + 8], eax

image-20231227110900594错误/image-20231227110900594.png)

这种只要是涉及到了esp或者rsp寻址的问题的基本上都是栈空间不足的问题,这个题我是用的栈迁移做的,所以我把栈迁移到bss距离较远的地方即可

image-20231227111146839错误/image-20231227111146839.png)

execve参数不为0

这种时候往往是程序的栈崩溃了,如果可以的话,我们可以直接打syscall的execve执行,或者说换个方法执行

环境变量被覆盖

我把栈地址修改成0x804b100,执行system("/bin/sh")是失败的,然后再和大佬的讨论中发现了几种可能,system需要获取系统的环境变量envp,通过看system的源代码,发现有一个全局指针变量_environ指向栈上的envp,如果这个值被覆盖成了一个无效的地址,system则无法执行。但是在该题中,我的第一个rop并不长,所以并没有覆盖掉envp,之后修改了栈地址,也不存在覆盖envp的情况。