문제 : Please win 1000 times in rock-paper-scissors
이 문제는 android apk reversing에 관한 문제이다. rps.apk 라는 파일을 먼저 준다.
tool : Genymotion, jd-gui, dex2jar, IDA Pro
일반 Mobile App을 분석하기 위해서는 설치 파일인 android 설치 파일인 APK를 알아야 한다.
※ APK(Android Package)
Android 플랫폼에서 어플리케이션 설치를 위해 배포되는 패키지 파일로, 압축 ZIP 파일 포맷 형태로 구성 되어있다. 주요 구성 요소는,
- AndroidManifest.xml : App에 대한 정보 및 실행권한 등의 전반적인 정보를 가지는 xml
- classes.dex : 클래스들의 정보를 함축적으로 가지고 있는 파일
- META-INF : 프로그램 자체 정보 데이터. 배포 시 인증서로 서명한 내용이다.
- res : 패키지가 가지고 있는 내부 리소스 폴더이다.
- assets : 패키지가 가지고 있는 외부 리소스 폴더이다.
- resources.arsc : 별도로 컴파일 된 리소스 파일이다.
classes.dex 파일은 android 실행 파일에 속하는 파일이라 보면 된다. dex2jar는 dex 파일로부터 class 파일을 추출하는 도구이다. 추출된 class 파일은 jd-gui라는 JAVA 디컴파일러를 통해 소스코드로 복원할 수 있다.
Genymotion을 통해 실행시켜보면 일반적인 가위바위보 App이다. 바로 소스코드를 확인해보자.
소스 코드를 보면 SECCON 플래그 값을 뽑아내는 부분이다.
위 소스코드를 보면 cnt의 값이 1000이 되면 SECCON{107*(this.cnt + this.calc())} 인 것을 볼 수 있다.
cnt 값은 1000인 것을 알 수 있다. 하지만 calc 값은 알 수 없다.
calc() 정의되는 위치를 찾을 수 있다.
JNI(Java Native Interface)에 대해 알아야 하는데 쉽게 설명하면, Java와 C/C++ 언어를 연동하는 솔루션이라 보면 된다.
[lib] – [x86] 폴더로 접근하니 libcalc.so 라이브러리 파일이 보인다.
IDA Pro를 통해 분석해보니 calc() 함수는 7을 return 하는 것을 확인할 수 있었다.
그래서 플래그는 SECCON{107*(1000+7)} 이 된다. 즉, “FLAG : SECCON{107749}” 이다.
'ctf' 카테고리의 다른 글
[CodeGate 2013 CTF] binary 100 (1) | 2016.01.04 |
---|---|
[CSAW 2013 CTF] DotNetRevering.exe (0) | 2016.01.04 |
[CSAW 2013 CTF] csaw2013reversing1.exe (0) | 2015.12.31 |
[CSAW 2013 CTF] csaw2013reversing2.exe (0) | 2015.12.31 |
[SECCON 2015 CTF] exec-dmesg (0) | 2015.12.27 |