Wargame/HackCTF

[HackCTF] x64 Simple_size_BOF

h4won 2021. 3. 19. 23:34

1. 문제 의도 파악

파일을 한번 실행시켜보았다.

오 자살방지 문제라니.. 쉽나보다 다행....

 

ida로 파일을 띄어보았다.

 

printf 함수를 통해 v4의 주소가 leak 되고 있다. 나중에 써먹으면 될 듯하다.

그리고 gets 함수로 입력을 받아 v4 버퍼에 저장하는데, gets 함수는 입력값을 검증하지 않기에 bof를 일으켜 RET 값을 변경할 수 있을 것이다.

 

 

 

2. Offset 구하기

main의 스택 프레임

main의 스택 프레임은 위와 같다.

v4의 시작주소는 RBP-0x6D30이므로, RBP로부터 27952 Byte 만큼 떨어져있다.

-> offset은 (27952 + 8)이다.

 

따라서 버퍼에 shellcode를 넣고 RET 전까지를 dummy 값으로 채운 뒤 RET에 v4의 시작 주소를 넣으면 될 듯하다.

payload는 다음과 같을 것이다.

payload = "shell code" + "dummy 값" + v4의 주소

 

 

 

3. payload 작성하기

위의 논리대로 payload를 작성해보았다.

x64라는 점을 고려해서 쉘코드도 x64용 쉘코드를 썼다.

그리고 v4의 주소는 실행 시 노출이 되기 때문에 14바이트만큼 받아서 16진수로 변환해서 사용하였다.

 

완성된 Payload는 다음과 같다.

shellcode(23Byte) + Dummy값(27952+8-23) + v4의 시작주소

 

성공적으로 flag를 획득하였다!!