ASLR负责堆、栈、LIBC加载基址随机化。
PIE负责代码段(.code)、数据段(.data/.bss)加载基址随机化。
开启aslr和pie后,ret2libc变得特别困难,.plt和.got调用,前者是对ELF文件的offset,后者是对运行加载基址的偏移,调用不了。找了些文件。
https://amriunix.com/post/from-read-glibc-to-rce-x86_64/
上面这遍文章通过read@GLIBC汇编,找到了syscall和ret,用于实现execve('/bin/sh')。
![](https://img.haomeiwen.com/i10771831/d448f02a49185897.png)
![](https://img.haomeiwen.com/i10771831/8d958978cebc455c.png)
如果有syscall,就可以变为任意函数,如read变为write,只需要改变rax值即可。牛B。
到这一步,还没有绕过pie,开启pie时,代码里面不是虚拟地址,都是相对地址。继续找。
https://pollevanhoof.be/nuggets/buffer_overflow_linux/5_PIE_bypass
这遍文章讲述通过泄露堆上的RIP来进行后继操作,PIE大概率是爆破,或者memory leak。
网友评论