查看文件基本信息
1 | v1cky@ubuntu:~/Desktop/pwnable/3x17$ checksec 3x17.dms |
可以看到程序是64位,开启了栈不可执行,这里看的是没有开启canary保护,但是直接看汇编发现有canary保护。没有开启地址随机化。而且程序是静态链接的。在程序看到了sys_read,sys_write系统调用。所以这题的思路是利用rop最后调用sys_execve(‘/bin/sh’,0,0)getshell。
1 | v1cky@ubuntu:~/Desktop/pwnable/3x17$ ldd -d 3x17.dms |
IDA查看文件逻辑
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
基本逻辑就是在输入的地址处输入任意数据,就是任意地址写。
利用
漏洞很明显,任意地址覆写,但是应该如何覆写,这里需要在一次运行中多次往一块区域写入rop,在参考了别人的wp之后知道了有个叫.fini.array的数组,里面保存着程序执行完之后执行的函数,这里的思路是可以覆盖.fini.array数组的内容来控制程序执行流程。有一点需要注意的是.fini.array数组里保存的函数是逆序执行的,也就是说会先执行.fini.array[1]再执行.fini.array[0]。我们可以将.fini.array[1]的值改为main函数的地址,将.fini.array[0]改成调用控制.fini.array的函数0x402960,这样执行完main之后就执行又继续执行调用main函数的函数。这样就可以形成循环一直任意地址覆盖写。
exp
1 | addr: |
参考