Sharif_CTF
# Sharif University CTF 2016 : Android App - Points : 100 - Solves : 58 - Description : ``` Find the Flag!! Download Sharif_CTF.apk ```
핵심로직
String str = new String(" ");
str = this.f5a.f1b.getText().toString();
Log.v("EditText", this.f5a.f1b.getText().toString());
String str2 = new String("") // 미사용 변수
int processObjectArrayFromNative = this.f5a.processObjectArrayFromNative(str);
int IsCorrect = this.f5a.IsCorrect(str);
str = new StringBuilder(String.valueOf(this.f5a.f3d + processObjectArrayFromNative)).append(" ").toString();
-IsCorrect 함수는 native 코드로 구현된 함수다. (public native int IsCorrect(String str);)
System.loadLibrary("adnjni"); => lib>armeabi>libadnjni.so 라이브러리가 존재함
★ JNI로 만들어진 IsCorrect와 processObjectArrayFromNative함수를
IDA로 분석해야 될 것 같은데 IDA코드봐도 전혀 모르겠다. 너무 복잡함...이건 베이비 수준이 아니야..
--IDA에서 string window의 단축키는 쉬프트+F12
-processObjectArrayFromNative: 자바와 네이티브코드 간에 객체배열 전달하기
-StringBuilder(String s) : 값이 지정된 문자열로 초기화되고 문자열 뒤에 추가 16 개의 빈 요소가 추가 된 문자열 작성기를 만듭니다.
-String.valueOf : 매개변수로 넘어온 값을 String으로 변환한다.
try {
MessageDigest instance = MessageDigest.getInstance("MD5");
instance.update(str.getBytes());
byte[] digest = instance.digest();
StringBuffer stringBuffer = new StringBuffer();
for (byte b : digest) {
stringBuffer.append(Integer.toString((b & 255) + 256, 16).substring(1));
}
if (IsCorrect == 1 && this.f5a.f4e != "unknown") {
this.f5a.f2c.setText("Sharif_CTF(" + stringBuffer.toString() + ")");
}
핵심로직 분석
1. getText() 메소드는 EditText필드에 있는 데이터를 가져온다.
2. MesssageDigest("[타입유형,MD5,SHA-1 등...]")
=> 해쉬암호화 클래스를 의미한다. 여기서는 MD5 알고리즘을 사용한다.
3. 난독화된 this.f5a.f4e의 의미 = this.mainActivity.f4e
활성화된객체->메인엑티비티객체->f4e
f4e는 문자열 "Code" 또는 Build.SERIAL 값이다.
아래 문법의 의미를 파악해야 할것 같음!
4. stringBuffer.append(Integer.toString((b & 255) + 256, 16).substring(1));
Integer.toString((b & 255) + 256, 16)
- (b & 255)+256 = b&255는 한 바이트의 범위(0~255)를 검증하는 것이며 이후 해당 바이트에 256을 더한다.
- toString(매개변수 바이트+256= ?, 16) => toString(int,radix) 즉 16진수인 Hex형태의 문자열로 변환하는 코드다.
- substring(1) : 인덱스[1](두번째 요소)부터 시작하는 새로운 문자열로 반환한다. 즉, 0x?? => x?? 로 바꾸는 코드
★ 아 로직 분석해도 모르겠넹, 최종적으로 두가지 방법 밖에 안떠오른다.
아래 조건식을 프리다로 강제로 맞추기 => 그럴경우 플래그 출력 못함..분석으로 찾아야할거 같다.
IsCorrect == 1 && this.f5a.f4e != "unknown"
또한 IsCorrect 변수와 함수 그리고 this.f5a.f4e 변수를 프리다로 Trace 가능한지....?
★ 우선 프리다 클래스 후킹 이해 안되서 못하겠다. 왜 난독화된 클래스는 후킹이 안될까..?
여기까지하고 기권, 롸잇업 보기로함
## Write up
MainActivity가 libadnjni.so을로드하고 processObjectArrayFromNative를 가져오고있다.
processObjectArrayFromNative 하드 코딩 된 문자열과 비교하고있다.
프리다 문제인줄알고 삽질 엄청했다....
문제의도는 디컴파일 후 so 파일에 존재하는 하드코딩 찾는 문제였던 것이다..ㅜㅜ
이번 CTF문제를 통해 얻은 것
1. 파이썬3 print formating 문법을 배움
2. 프리다 기초 문법을 배움
3. 아이다 string view 단축키 외움
4. 자바 몰랐던 새로운 매소드 배움
5. 찾아보니 프리다로 네이티브 코드도 후킹 가능하다는 사실을 알게됨
'리버싱CTF > 미분류 CTF' 카테고리의 다른 글
Internetwache CTF 2016 : File Checker (0) | 2019.12.30 |
---|---|
Internetwache CTF 2016 : SPIM (0) | 2019.12.30 |
Sharif University CTF 2016 : SRM (0) | 2019.12.30 |
Sharif University CTF 2016 : Serial (0) | 2019.12.30 |