본문 바로가기

6. Wargame write-up

[HackCTF] BOF_PIE

HackCTF BOF_PIE

 

파일의 보호기법을 확인해보니 BOF_PIE 문제이름에 맞게 NX bitPIE가 걸려있네요!

 

NX가 걸려있기 때문에 스택에 값을 써서 실행할 수 없고 PIE가 걸려있어 바이너리 영역을 랜덤하게 배치해줍니다.

 

파일을 실행시켜보면 어떤 함수의 주소를 알려주는 것 같고 “Nah…”라는 문구를 출력하고 끝나네요.

 

 

IDA로 바이너리를 열어보면 main 함수에서 “welcome” 함수와 “puts” 함수를 호출해주는 것을 알 수 있습니다. puts함수는 “Nah…”만을 출력해주는 역할을 하니 welcome 함수를 분석해야겠네요.

 

 

 

welcome 함수를 살펴보니 알려준 주소 값은 welcome 함수의 시작 주소 값인 것 같습니다.

 

 

함수명에서 “j0nghyun”을 확인할 수 있습니다. 해당 함수를 분석해보겠습니다.

 

 

fopen 함수에 flag 인자를 넘겨주는 것을 보니 해당 함수를 실행하면 flag 파일을 읽어와 밑에 puts 함수로 flag를 출력해주겠네요! 그럼 입력 받는 공간에 버퍼오버플로우를 일으켜 ret 주소를 “j0n9hyun” 함수로 조작해 실행흐름을 바꾸겠습니다.

 

리턴 주소만큼은 입력 받는 공간에서 22byte 떨어져있으므로 “dummy(22byte) + ret” 으로 payload를 구상하면 될 것 같습니다.

 

바이너리를 실행하면, 실제 메모리에서 올라간 welcome 주소를 알아올 수 있으니 공격 코드를 짜기 좀 더 수월하겠네요! 우선 PIE가 걸려있기 때문에 메모리 주소가 매번 달라지니 libc에 있는 주소를 leak해야합니다.

 

바이너리를 실행하면, 실제 메모리에서 올라간 welcome 주소를 알려주니 libc_base 주소는 바이너리를 실행시켜 알아온 welcome 주소 – welcome 주소의 offset 값으로 구해오고실제 조작할 ret 주소는 libc_base + j0n9hyun 함수의 offset 값으로 주겠습니다.

 

 

exploit 코드

 

 

flag 값 획득!

 

 

'6. Wargame write-up' 카테고리의 다른 글

[HackCTF] Yes or no  (0) 2021.09.13
[HackCTF] Hidden  (0) 2021.09.07
[SquareCTF(2017)] Needle in the haystack 풀이  (0) 2021.05.19
[SquareCTF(2017)] Reading between the lines 풀이  (0) 2021.05.13
[SquareCTF(2017)] 6yte 풀이  (0) 2021.05.06