题目中给出现成的调用system("/bin/sh");
的执行地址,且存在栈上面的缓冲区溢出漏洞,不过因为程序开启了PIE(地址随机化),所以不能直接的用IDA中显示的地址覆盖。
不过地址随机化了,但最后一个字节的地址还是一致的,这里可以利用vsyscall
来进行滑动,在内存中找到合适的地址来利用就可以了。vsyscall
是无参数的调用,就相当于一个ROP gadget, 可利用的三个地址为:0xffffffffff600000, 0xffffffffff600400, 0xffffffffff600800。
仔细调试程序,发现在栈上存在一个可利用的地址,即__libc_start_main
传参的时候把main函数的地址放到了栈上,而main函数的地址和system("/bin/sh");
的地址就只有最后一个字节不一样,所以就可以利用了。
exp:
1 | #!/usr/bin/python |
本地测试如下: