x64 Simple_size_BOF Write-Up
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를 따낼 수 있었음