UnCrackable_level2.apk 풀이, Frida Native Library 후킹

2020. 5. 20. 12:242020/Android App Hacking

 

 

level1과 마찬가지로 디바이스의  루팅여부를 판단한다. exit함수 후킹코드를 작성하고 프리다를 통해 실행시킨다.

위 과정은 이전 게시글에 설명되어 있음.

이제 비밀번호를 확인하는 과정을 살펴본다.

this.m.a (입력값): m.a은 무엇인가?

CodeCheck 클래스 객체 m

CodeCheck클래스는 native library 함수 bar을 사용한다.

CodeCheck클래스의 this.m.a( 입력값 ) 의 반환값은 즉 CodeCheck.a(input) = bar(input)

 

그럼 native library에 존재하는 bar함수는 어떻게 분석할 수 있는가?

IDA, Ollydbg등의 프로그램을 활용할 수 있지만, 리눅스 리버싱 도구 radare2 프로그램을 사용할 것이다.

 

사용 명령 : rabin2, r2

rabin2 - 라이브러이에서 활용하는 모듈들을 검사할 수 있다.

r2 - 라이브러리 파일의 내부를 들여다 볼 수 있다.

 

# rabin2 -s <libraryFile> : symbols

# rabin2 -i <libraryFile> : 라이브러리에서 임포트하는 모듈 리스트

# rabin2 -E <libraryFile> : 라이브러리에서 익스포트하는 모듈 리스트

 

# r2 <libraryFile> : 라이브러리 파일들 내부 확인

> e emu.str=true : 라이브러리파일의 주석 확인가능 (매우유용)

> ? : help명령

> is~Java

- i: get information

- s: pattern

- ~Java : Java를 포함하는 문자열

> s 0xXXXXXXXX : 해당 주소로 이동

> af : 현재 주소부터 분석

- a: analyze

- f: add a flag

> pdf : 현재 주소부터 분석한 것들 출력

- p: print

- d: debugging mode

- f: add a flag

 

소스코드에서 System.loadLibrary("foo")를 확인할 수 있다. 해당 라이브러리에 bar메서드가 존재하는지 확인하자.

라이브러리 파일은 apktool을 통해 앱을 디컴파일 했을 때 얻을 수 있다.

 

애플리케이션에는 디바이스의 버전이 다양하기 때문에 다양한 버전의 라이브러리가 존재한다.

 

library foo.so - export list - Java Mainactivity_init, CodeCheck_bar 

해당 라이브러리에서 해당 클래스들이 무엇을 가져다가 사용하는지 코드를 보고 확인할 수 있다.

CodeCheck_bar에서 사용하는 코드를 확인해보자. (strncmp함수를 사용하는 것을 확인할 수 있음)

다음 변수들이 무엇인지 확인하자.

; var int32_t var_1ch @ sp+0x1c

; arg int32_t arg1 @ r0

; arg int32_t arg3 @ r2

 

google: strncmp reference

int strncmp ( const char* str1, const char* str2, size_t num );

strncmp함수의 첫 번째 인자는 r0, 세 번째 인자는 r2

코드에서 cmp r0, 0x17 => 사용자가 입력하는 값의 길이가 23인 경우에 strncmp함수를 실행한다.

비밀번호 검증과정에서 두번 째 인자에는 앱에 저장된 비밀번호가 입력되고 strncmp함수를 통해 입력값과 비교한다.

strncmp함수를 후킹해서 두 번째 인자에 들어있는 값을 화면에 출력하자.

 

* 비밀번호를 검증하는 루틴을 분석하는 과정에서 strncmp함수를 발견하였다. 이 때 해당 함수는 비밀번호를 검증하는 데 사용하고 있다고 유추할 수 있어야한다.

strncmp에서 두번 째 인자가 무엇인지 파악할 수 없지만, r0에 입력값이 r3에는 입력값을 특정 길이값이 들어감으로 두 번째 인자에 앱에서 하드 코딩되어 사용하는 비밀번호가 들어감을 유추할 수 있어야한다.

 

Interceptor.attach( addr, callbacks ) : 해당 주소에 위치한 함수, 모듈에 동작 추가