본문 바로가기
보안 및 개발/MOBILE

[Android] SuCTF 2014 Reverse200

by CH@3M 2020. 1. 29.

2014년 Su (Sharif University) CTF 에서 출제된 Reverse200 문제입니다. 

suCTF.apk
1.58MB

apk를 실행해보면 다음과 같은 앱이 동작합니다. 디컴파일을 해봐도 알 수 있지만, 초점은 시리얼 키를 찾아내는 것으로 보입니다. 

여러 버튼을 눌러보니, 오른쪽 상단의 설정모양 버튼을 클릭하면 Product Key를 입력하라고 합니다.

아무 문자열이나 넣고 Continue를 눌러보니 다음과 같은 문자열을 출력해 줍니다.

이제 JEB로 디컴파일하여 분석해 봅시다.

MainActivity를 보면, if(KeyVerifier.isValidLicenceKey(this.val$userInput.getText().toString(), MainActivity.this.app.getDataHelper().getConfig().getSecurityKey(), MainActivity.this.app.getDataHelper().getConfig().getSecurityIv())) 를 만족해줘야하는 것을 알 수 있습니다. 각 인자로, 사용자의 입력 값, SecurityKey, SecurityIv 를 받습니다.

KeyVerifier 클래스의 isValidLicenceKey() 를 보면, 인자 3개와 문자열29a002d9340fc4bd54492f327269f3e051619b889dc8da723e135ce486965d84를 이용하여 암호화하는 것을 볼 수 있습니다.

encrypt() 함수를 보면 암호화 과정을 볼 수 있습니다.

SecurityKey, SecurityIv을 어디서 얻어오는지 보면, DBHelper 클래스의 getConfig() 함수에서 가져오는 것을 알 수 있습니다. 이 함수를 보니, DB에서 해당 값을 가져오는 것 같습니다.

DBHelper 클래스의 앞부분을 보면 DB 정보가 나와있습니다. db의 이름은 db.db이고, table 이름은 config 임을 알 수 있습니다.

apk의 압축을 해제하여 assets 폴더 안을 보면 db.db 파일이 있습니다.

이 파일을 DB Browser를 이용하여 열어보면 안의 데이터를 확인할 수 있습니다.

위의 getConfig() 함수를 통해 SecurityIv는 5번째 열, SecurityKey는 6번째 열에 있는 것을 확인하였습니다.  

SecurityIv =  a5efdbd57b84ca36

SecurityKey = 37eaae0141f1a3adf8a1dee655853714

이 정보를 이용하여 복호화를 진행하면 됩니다! python으로 PyCrypto 모듈을 이용하여 AES 복호화를 구현하면 될 것 같습니다. 익스플로잇은 추후에 추가하도록 하겠습니다.

반응형