hijack retaddr(劫持返回地址)
原理
很容易理解,我们要利用格式化字符串漏洞来劫持程序的返回地址到我们想要执行的地址。
这里以三个白帽pwnme_k0为例:
这里有NX和Full RELRO,先介绍一下RELRO:
Partial RELRO: gcc -Wl, -z, relro:
ELF节重排
.got, .dtors,etc. precede the .data and .bss
GOT表仍然可写
Full RELRO: gcc -Wl, -z, relro, -z, now
支持Partial RELRO的所有功能
GOT表只读
那么这里我们就无法修改got表了。
分析程序
简单分析得知,程序实现了一个类似注册之类的功能,能够查看和修改,我们在查看功能发现了格式化串漏洞,即输出时:
我们看到,printf(&v9+4),这里回溯一下,发现我们输入的password也是&v9+4:
我们还发现我们输入的username在距离password的20字节处:
利用思路
我们的最终目的就是为了获得系统的shell,我们发现在0x4008A6地址处有直接调用system(’/bin/sh’)的函数,那如果我们修改某个函数的返回地址为这个地址,那就相当于获得了shell: