반응형

PC환경에서 Stack Buffer Overflow 자료는 많이 있는데, 모바일 환경(iOS)에서 Stack Buffer Overflow 관련해서는 자료가 많이 없더군요. 그러던 중 매우 훌륭한 글 및 실습자료를 발견하여 보고 따라해봤습니다.

원글은 https://www.inversecos.com/2022/06/guide-to-reversing-and-exploiting-ios.html 입니다. 👍👍👍

 

Guide to Reversing and Exploiting iOS binaries Part 2: ARM64 ROP Chains

 

www.inversecos.com

 

 

실습자료는 https://github.com/inversecos/ios-dontpopme 여기서 다운받을 수 있습니다만, 이해가 쉽도록 프로그램이 바로 종료되지 않게 살짝 수정한 버전으로 테스트해보려고 합니다. (getchar() 2개 추가)

 

 

fread 라는 함수에서 stack buffer overflow 가 발생하는데, 이를 이용해서 임의의 코드를 실행시키는게 목표입니다.

우선 임의의 문자열을 채워넣은 resume.txt 파일을 생성해줍니다.

 

 

fread 함수에서 resume.txt 파일을 읽어들일때 스택에 어떻게 쌓이는지 보도록 하죠

실습 파일을 실행시키고, 메모리 뷰어를 붙이고, fread 함수 주소로 이동합니다.

 

 

fread 함수에 후킹을 걸어줍니다. 그리고 실습 프로그램에 아무 문자입력하고 엔터치면 fread 함수가 실행되면서 resume.txt 파일을 읽어들이게 됩니다. 이때 레지스터를 관찰해봅니다.

 

 

x0 레지스터에 버퍼 포인터 주소가 전달됩니다. 따라가보면, fread 함수에서 읽어들인 resume.txt 파일의 내용이 스택에 쌓여있는것을 볼수 있습니다.

 

 

밑에 보면 의심스러운 값이 보이는데, 함수를 호출하면 돌아갈 주소를 저장하는 lr 레지스터("link register")도 스택 공간에 저장된다고 합니다.

 

 

원래의 돌아갈 주소를 오염시키면 엉뚱한 주소로 돌아가고 보통 앱이 크래시가 날테니, 이를 통해 오버플로우의 타겟("lr" 레지스터)을 확정할수 있겠군요.

resume.txt 에 6글자를 더 채우면, 위 그림에서 "d0 04 ac 04 01"(0x104ac04d0)가 "36 04 ac 04 01"(0x104ac0436) 으로 오염될테고 크래시가 나겠죠? 채워봅시다. (echo -n 옵션을 사용하면 문자열 끝에 붙는 line feed 문자 "0a"를 제거합니다)

 

 

프로그램을 실행해보면, bus error 라고 크래시가 나는군요.

 

 

이것으로 오버플로우의 타겟이 확정되었습니다.

페이로드는 다음과 같은 모양이 되겠죠.

"1234567812345678123456781234567812345<악성주소 8byte>"

 

실습 프로그램에서는 오버플로우로 "runCode" 라는 함수를 실행시키기를 원합니다.

프로그램을 실행하고, 메모리 뷰어를 붙이고, "runCode" 함수의 주소를 확인합니다. 0x104affc60 이군요

 

 

이제 오버플로우 공격으로 runCode 함수가 실행되도록 resume.txt에 페이로드를 작성해줍시다. (echo -e 옵션을 사용하면 escape 표현("\x")을 사용가능합니다)

 

 

이제 다시 프로그램에 아무 문자열을 입력하면 다음과 같은 일이 일어납니다.

fread 함수가 실행 --> resume.txt 파일 읽어들임 --> 오버플로우 발생, "lr" 레지스터가 "runCode" 함수 주소값으로 오염 --> "runCode" 함수 내 "ls -la" 명령어 실행

"ls -la" 명령어가 실행되어 디렉터리 내 파일목록이 출력되는 것을 확인할 수 있습니다.

 

 

 

 

 

반응형

+ Recent posts