문제 소개
상용 안드로이드 어플리케이션을 개발했지만, 불행히도 개발은 멈췄고 출시를 하지 못하게 되었습니다. 하지만 유효한 키를 찾아서 프리미엄 기능을 열어달라고 합니다.
APK 분석
apk 를 제공해 주므로, apktool 을 이용하여 디컴파일을 진행합니다.
.
├── THC
│ ├── AndroidManifest.xml
│ ├── apktool.yml
│ ├── original
│ ├── res
│ └── smali
└── THC.apk
apk 를 디컴파일해보면, 여러 구성 요소들이 보입니다.
AndroidManifest.xml
파일을 확인해 보면, com.thc.bestpig.serial.MainActivity
가 메인 엑티비티 인 것을 알 수 있습니다.
MainActiviy->onCreate() 부터 살펴 봅니다. onCreate() 에서 하는 게 많지만, 핵심은 마지막 부분에 위치합니다.
Id가 0x7f070023
View 를 가져와서 버튼인지 확인을 하고, MainActivity$3의 <init>
함수를 호출하고 버튼에 Click Listener 을 설정합니다.
<public type="id" name="buttonActivate" id="0x7f070023" />
Id 가 0x7f070023
인 것을 확인해 보면, buttonActivate
라는 이름을 확인할 수 있습니다.
더 확인해보면, 텍스트로 "Activate Software" 를 가진 버튼임을 확인할 수 있습니다.
다시 MainActivity$3 으로 돌아와서, 버튼을 click 하게 되면 위의 method 가 호출됩니다.
입력한 값을 가져와서 문자열로 바꾸고, 이 문자열을 MainActivity의 checkPassword() 메소드의 인자로 하여 호출합니다.
checkPassword 메소드에서는 이 문자열을 다시 validateSerial 메소드의 인자로 하여 호출을 하고, 결과값이 1이 아니면 인증 실패 루틴으로 이동하게 됩니다. 따라서 validateSerial 메소드에서 1을 반환할 조건을 분석해 봅니다.
validateSerial 메소드에서는 v0 의 값을 return 하게 되는데, 이 값이 1이 되는 경우는 아래에 더 존재하는 모든 조건을 충족하는 경우만 있습니다. 따라서 이 조건들을 정리해 보면 아래와 같습니다.
.line 18 len(flag) == 0x13
.line 20 flag[0x04] == flag[0x09] == flag[0x0e] == 0x2d
.line 22 flag[0x05] == flag[0x06] + 0x01
.line 25 flag[0x05] == flag[0x12]
.line 28 flag[0x01] == (flag[0x12] % 0x04) * 0x16
.line 30 flag[0x0a] == flag[0x03] * flag[0x0f] / flag[0x11] - 0x01
.line 32 flag[0x01] == flag[0x0a]
.line 34 flag[0x0d] == flag[0x0a] + 0x05
.line 36 flag[0x0a] == flag[0x05] - 0x09
.line 38 0x5a0 == (flag[0x00] % flag[0x07]) * flag[0x0b]
.line 40 flag[0x02] - flag[0x08] + flag[0x0c] == flag[0x0a] - 0x09
.line 42 (flag[0x03] + flag[0x0c]) / 0x02 == flag[0x10]
.line 44 flag[0x00] - flag[0x02] + flag[0x03] == flag[0x0c] + 0x0f
.line 46 flag[0x03] == flag[0x0d]
.line 48 flag[0x10] == flag[0x00]
.line 50 flag[0x07] + 0x01 == flag[0x02]
.line 52 flag[0x0f] + 0x01 == flag[0x0b]
.line 54 flag[0x0b] + 0x03 == flag[0x11]
.line 56 flag[0x07] + 0x14 == flag[0x06]
이 조건들로 시리얼을 직접 구할 수도 있지만, SMT solver 중 하나인 Z3 를 이용하여 solver 를 만듭니다.
Serial 구하기
위에서 찾은 식을 조건에 추가하고, 조건을 충족하는 결과 값을 출력합니다.
위에서 구한 serial 값을 입력하면, 활성화에 성공한 것을 확인할 수 있습니다.
'0x00 Reversing > 0x02 CTF' 카테고리의 다른 글
InCTF 2019 :: cliche_crackme (0) | 2019.10.05 |
---|