ctf-wiki之ret2syscall

ret2syscall即控制程序执行系统调用,获取shell

查看一下程序保护


开启了栈不可执行保护

程序放进IDA中


发现gets函数明显的栈溢出。但程序中没有system等函数供使用。

则利用系统调用指令 inx80运行execve("/bin/sh",NULL,NULL)获得系统shell

将系统调用号存入eax寄存器,第二个参数,第三个参数,第四个参数分别存进

ebx,ecx,edx寄存器即可执行execve("/bin/sh",NULL,NULL)

在eax寄存器中存放系统调用号0xb

在ebx寄存器中存放"/bin/sh"

在ecx寄存器中应为0

在edx寄存器中应为0

execve()函数作用时执行一个新的程序,程序可以是二进制的可执行程序,也可以是shell,python脚本。

想要在寄存器中存放各种值,当栈顶为10时,调用pop eax出栈指令即可将寄存器eax赋值为10。

那么我们就需要在程序中寻在 pop eax;ret;等指令的地址

通过指令 ROPgadget即可找到相应的地址


找到符合的地址为0x080bb196


找到pop edx ecx ebx的地址 0x0806eb90


/bin/sh的地址为0x080be408


获得int 0x80的地址为0x08049421

脚本:


运行结果:


你可能感兴趣的:(ctf-wiki之ret2syscall)