뉴비에욤

[안드로이드 APK 진단] DIVA - 13.입력 값 검증 부재 파트 3 본문

Android_Vuln

[안드로이드 APK 진단] DIVA - 13.입력 값 검증 부재 파트 3

초보에욤 2018. 3. 20. 13:49

13번 문제를 클릭 해 보면 고전적인 메모리 오염 취약점이라고 한다. 일반적으로 사용자의 입력으로 인해 일어아는 메모리 오염 취약점은 스택 오버플로우이다.


해당 문제의 코드를 보면 위 사진과 같은데 12번과 비교했을 때 딱히 달라진 것은 없다.

* access 대신 initiateLaunchSequence 함수를 사용한다는 정도가 차이점.


오버플로우 문제로 추정되니 'A' 문자열을 40개 정도 입력해 본다.


40개의 문자 입력 시 뻗는다.


logcat을 통해 메시지를 보면 SIGSEGV(세그먼트 폴트) 에러가 발생하였고 eip 레지스터 값이 41414141 인 것을 볼 수 있다.


* 전형적인 오버플로우 취약점으로서 지문에서 말한 것처럼 익스가 가능한 환경이긴 하다. 그러나 여러모로 귀찮기 때문에 다른 방법을 이용하여 문제를 해결할 것이다.




다시 한번 위 사진을 살펴보면 DIVA 앱은 JNI 라는 개념을 사용한다는 것을 볼 수 있다.

JNI는 Java Native Interface의 약자로 쉽게 말하면 자바로 만들어진 프로그램에서 다른 언어로 작성 된 코드에 접근하기 위한 일종의 API라고 보면 된다.



DIVA 어플의 소스 코드를 다운 받아서 "app-src-main-jni" 경로로 이동하면 "divajni.c" 파일을 볼 수 있는데 해당 소스 파일의 일부 소스는 위 사진과 같다.


initiateLaunchSequence 함수 코드를 보면 취약점이 존재하는 strcpy 함수를 이용하여 사용자가 입력한 값을 code 변수에 복사하여 실제 비밀번호 변수인 CODE와 비교하고 있다.

 * ".dotdot" 문자열이 이번 13번의 액세스 코드가 되겠다.


문제는 사용자 입력값이 저장되는 code 변수는 전처리의 CODESIZEMAX에 의거, 20 바이트로 할당 된 상태라는 것이다.

이전에 우리는 40개의 문자를 입력했고 이게 사이즈를 체크하지 않는 strcpy 함수로 복사되었기 때문에 오버플로우가 발생한 것이다.


13번 문제 출제 의도는 일반적으로 Java는 별도의 JVM이 존재하고 이것이 대부분의 버그를 자체적으로 처리하기 때문에 안전하다고 여겼지만 JNI와 같이 다른 언어(C,C++ 등)을 호출하는 경우에는 여전히 익스플로잇이 가능하다는 것을 보여주기 위함으로 생각된다.



Comments