Wargame/HackCTF

x64 Simple_size_BOF Write-Up

LikeMermaid 2021. 9. 16. 04:24
728x90

1. x64 Simple_size_BOF

1.1 파일 분석

- file 명령어로 Simple_size_bof 파일의 종류를 확인해보니 64bit ELF 파일임

 

- Simple_size_bof 파일을 실행해보니 '삐빅 - 자살방지 문제입니다.'를 출력하며 메모리 주소값으로 출력되는 buf문을 출력하며 입력값을 받음

 

- ida로 코드를 디컴파일하여 확인해보니 2가지 포인트를 알 수 있었음
point 1. printf함수에서 %p(포인터)를 통해 v4변수의 시작 주소를 출력함
point 2. get함수를 통해 v4에 27952bytes 보다 많은 값을 입력받을 수 있음

 

- ASLR이 적용되어 있지만 바이너리를 실행하면 v4 변수의 시작 주소를 출력하기 때문에 shellcode를 삽입하여 RTS(Return To Shellcode) 공격 기법을 사용하여 문제를 해결할 수 있었음

RTS 공격 기법 : 함수의 기존 Return Address를 Shellcode가 있는 주소로 덮어씌워 함수가 종료되고 복귀 때 Shellcode로 복귀시켜 쉘코드 명령을 실행하게 하는 기법

 

1.2 poc

- 5번째 줄 : remote로 워게임 서버에 접속하기 위한 코드

- 7번째 줄 : 64bit 환경에서 사용할 수 있는 쉘코드

- 9번째 줄 : 'buf: ' 까지 데이터를 받아 오는 코드

- 11번째 줄 : 데이터 한줄을 받아 buf 변수에 저장하는 코드

- 13번째 줄 : buf변수에 담겨있는 string 값을 잘라서 리스트로 만들어 주는 코드

- 15번째 줄 : 불필요한 값을 제외한 buf 리스트 0~14에 담겨있는 값(주소값)을 buf_addr 변수에 저장하는 코드

- 18번째 줄 : v4 변수의 시작부분을 shellcode를 덮는 코드

- 19번째 줄 : v4 변수 중 쉘코드 길이를 제외한 부분인 27929(27952-23)bytes를 덮기 위한 코드

- 20번째 줄 : SFP를 덮기 위한 코드

- 21번째 줄 : 바이너리에서 출력해준 v4변수의 시작 주소를 string으로 받아 16진수로 변환한 뒤 int값으로 변환하여 64bit로 패킹한 코드

- 23번쨰 줄 : payload 코드를 확인하기 위한 출력문 코드

- 25번째 줄 : ':' 라는 데이터를 받은 후 payload에 담긴 값을 대상 서버에 전송하는 코드

- 27번째 줄 : 대상과 지속적으로 통신하기 위한 코드

 

1.3 결과

- 위에 작성한 코드(poc)로 flag를 따낼 수 있었음