상세 컨텐츠

본문 제목

0x03 모리부터 발끝까지! 후킹 문제 있어?!

Hooking

by 알 수 없는 사용자 2020. 8. 20. 22:16

본문

 

안녕하세요. 춘식입니다.

 

Uncrackable Level 2 를 풀어보겠습니다.

 

 

오늘도 역시 썸네일과 주제는 상관이 없습니다만

 

우선 현재 시국이 대사과의 시대인 만큼 사과 말씀 올리며, 포스팅 시작하겠습니다.

 

무슨 일인지는 모르겠지만 죄송합니다.

 

개선해야 할 점이 있다면 메일로 보내주시면 겸허히 받아들이겠습니다.

 

참고로 메일 주소는 개인정보라 알려드릴 수 없는 점 양해 부탁드립니다. (알 수 없는 의식의 흐름)

 

 

 

Level 2는 Level 1과 차이가 있습니다.

 

단순히 Java 코드 단에서만 노출된 메소드를 후킹하는 것을 벗어나,

 

범위를 조금 더 넓혀 Native 로 구현된 메소드를 후킹하는 것이 목적입니다.

 

 

딱 하나 주의사항이 있다면, IDA라는 프로그램이 필요하다는 것 입니다..

있으시면 괜찮지만 없으시면 잘 구해보셔요.. 화이링

 

 

그래서 오늘 포스팅은 아래와 같은 순서로 진행하겠습니다.

 

원활한 진행을 위해 설치 과정은 이전 포스팅을 참고해주세요.

 

동일한 과정이지만 이번에는 level 2를 설치하시면 됩니다.

 

 

2020/07/15 - [Hooking] - 0x02 - Frida Hooking: 가슴이 웅장해지는 후-킹

 

0x02 - Frida Hooking: 가슴이 웅장해지는 후-킹

안녕하세요 춘식입니다. 본격적으로 안드로이드 후킹에 들어가봅시다. ---------------------------------------------------------(진지)--------------------------------------------------------- 썸네일과..

redteam-securitylab.tistory.com

 

 

 

1. Native 란?

2. 로직 분석

3. 후킹 코드 작성 및 설명

4. 후킹 결과 확인

 

 

 

1. Native 란?

많은 안드로이드 애플리케이션이 Java로만 구현되어 있지는 않습니다.

 

여러 이유 때문에 Native로 구현을 하기도 합니다.

 

Native로 구현되어 있는 부분이 있다는 말의 의미는 C/C++ 로 구현된 로직이 포함되어 있다는 것입니다.

 

왜? 한가지 언어로만 구현하기도 어려운데 두 가지 언어를 혼용해서 구현한 걸까요?

 

그 이유에 대해 알아봅시다.

 

가장 정확한 이유는 "속도"의 차이 때문입니다.

 

여기서 말하는 속도는 회사 근처 맛집에 1등으로 들어갈 때의 속도가 아니라,

 

컴퓨터(디바이스)가 언어를 해석하는 속도라고 할 수 있는데요.

 

Java는 디바이스가 해석할 때 smali 라고 부르는 저급 언어로 한 번 번역을 거친 후에

 

컴퓨터 언어(흔히 아는 0과 1)로 컴파일 됩니다.

 

반면, C/C++는 별도의 번역 과정 없이 바로 컴파일 되어서(그래서 컴파일 언어라고도 합니다.)

 

Java 보다 한 단계가 적기 때문에 빠른 것이죠.

 

Native는 안드로이드 애플리케이션에서 Java가 아닌 C/C++로 구현된 부분입니다.

 

속도가 중요한 부분은 Native로 구현하는 것이 더 적합하다고 할 수 있겠네요.

 

이제 이 말의 의미를 이해하시겠나요?

 

다음으로 넘어갑시다. ㄱㄱ

 

 

2. 로직 분석

먼저, 이제는 친숙한 도구인 jadx-gui로 uncrackable Level 2.apk 파일을 열어 시작 액티비티를 확인합니다.

 

안드로이드 애플리케이션을 이루는 요소(전문 용어로 컴포넌트) 들이 명세되어 있는 AndroidManifest.xml 에서

 

시작 액티비티를 찾아보겠습니다.

 

 

이름이 MainActivity 인 경우 시작 액티비티라 추측할 수 있습니다.

(안드로이드 애플리케이션 프로젝트 생성 시 기본적으로 가장 먼저 생성되는 액티비티 이름이고, 많은 애플리케이션 )

 

또 다른 방법은 액티비티 하위 action, category로도 추측할 수 있습니다.

 

이 밖에도 디버깅을 통해서도 확인할 수 있고, 다른 방법들이 많겠지만..

 

 

 

백안!! 을 쓸 수 있다면.. 가능할 수도

 

 

일단 넘어가겠습니다.

 

intent.action.MAIN 이거나, category.LAUNCHER 가 하위에 포함된 경우에도

 

해당 액티비티는 대게 애플리케이션 실행 시 가장 먼저 실행되는 시작 액티비티입니다.

 

시작 액티비티를 찾았으니 액티비티의 코드안에서 검증하는 로직이 있는지 살펴 보겠습니다.

 

 

전 시간의 내용을 살짝 복습하자면 액티비티는 안드로이드의 화면 단위이며 Java 클래스입니다.

 

함수, 변수들이 있고 이 함수, 변수들의 묶음인 클래스도 있을 수 있는 "파일"이죠.

 

 

 

 

이제 이 클래스를 따라가서 어떤 로직이 있는지 우리가 찾는 후킹 대상이 있는지 살펴보도록 하겠습니다.

 

 

Step 1. MainActivity 클래스를 살펴보겠습니다..

 

시작 부터 동적 라이브러리를 불러오는 함수 System.loadLibrary를 통해 foo 라는 라이브러리를 불러오는 군요..

 

 

저 foo 라는 곳에 C/C++ 로 구현된 코드들이 있습니다.

 

하지만 단순히 라이브러리를 불러오는 것일 뿐 어떤 로직이 있는 것도 아니니 손가락을 조금만 더 튕겨서 아래를 살펴볼까요?

 

 

 

도르륵- 도르륵

 

Step 2. 64번째 줄을 보면 CodeCheck 라는 객체를 m 이라는 이름으로 생성하네요.. 

 

이름 부터 상당히 수상합니다. 73번째 줄을 보면 이 m이라는 객체가 가진 a라는 함수가 반환하는 값에 따라서

 

분기가 일어나는 것을 알 수 있습니다.

 

 

 

 

a 라는 함수가 True 를 반환하면 우리가 넘나 만나고 싶은 Success 라는 문구를 뱉어내구요.

 

False를 반환하면 마치 헤어진 여자친구한테 다시 만나자 했을 때 반응을 간접적으로 체험할 수 있죠..

 

"Nope..." "Nope..." "Nope..." "Nope..."

 

차이가 있다면 전여자친구는 Try again 을 말하지 않는다는 거.. 흐엉엉ㅇ어엉어엉ㅇㅇ얽

 

말해줘.. 추라이 어게인..

 

그럼 저 CodeCheck 라는 객체를 정의하고 있는 클래스의 a 라는 함수는 어떻게 구현되어 있는지 따라가봅시다!

 

 

Step 3. 호오.. CodeCheck 라는 클래스는 역시 bar 라는 C/C++로 구현된 함수를 native라는 키워드를 통해서 선언하고 있습니다..!

 

구체적인 로직은 아직 확인을 못하지만 바이트 형식의 인자를 받고 True, False 형식 데이터를 반환한다고 하네요 

 

 

 

우리가 찾던 a 함수도 bar 함수의 결과를 반환하는 것을 보니 역시 foo 라이브러리에 있는 bar 함수를 찾아가서

 

로직을 확인해 봐야겠습니다.

 

 

Step 4. IDA를 쓸 데가 됐습니다. IDA 아직 쓸 데가 아이다 하시는 분들은 낄낄.. 재치넘치는 분들

(레드팀 팀장님은 피식 하실 것 같네요.. 보고 계시죠..?)

 

IDA를 실행합시다!

 

 

apk 파일을 여는데 주의 할 점은 class.dex가 아니라 bar라는 함수가 있는 libfoo.so를 선택하고

 

아키텍처는 x86_64를 선택합시다! 꼭 64로 하셔야 해요. 이유는 바로 뒤에서 설명합니다

 

 

 

 

Step 5. 다음은 그냥 아무것도 선택하지 말고 넘어온 그대로 OK를 선택합시다!

 

 

 

Step 6. 실행하고 Exports 윈도우를 선택해볼까요?

 

Java 코드 단에서 Export 해준 클래스의 함수(메소드)를 불러오기 위해 Exports 윈도우에서

 

선택하고 더블 클릭해서 열어봅시다.

 

 

 

Step 7. 오우오우 알 수 없는 코드가 나와버렸네요.. 

 

어셈블리어에 익숙하신 분들은 느낌이 올 지 모르겠지만 저는 좀 더 프로그래밍 코드 형태로 확인하고 싶네요.

 

 

 

여기서, F5 단축키를 눌러봅시다

 

 

Step 8. 짜잔 Pseudocode-A 윈도우가 열리면서 CodeCheck 클래스의 bar 메소드가 프로그래밍 코드 형태로 바뀌었습니다..!

 

IDA의 유용한 기능 중에 하나인데요. x86 아키텍처로 실행하면 열리지 이 단축키가 먹히지 않아서

 

x86_64 아키텍처로 선택한겁니다.

 

 

 

한 줄 한 줄 다 뜯어볼 수 있겠지만 우리의 목적을 잊지 맙시다.

 

후킹 대상 함수를 찾는 것!

 

코드 아래 부분에 특정 조건에 따라서 result 라는 결과를 반환한다는 것을 알 수 있네요..!

 

저 strncmp가 뭐하는 녀석이길래??

 

 

 

 

Step 9. 구글링 좀 해봤습니다. 저 함수는 문자열을 비교하고..!? 비교하고?!!?!!

 

이 녀석이네요. 6-_- ;;

 

우리가 화면에서 값을 입력하면 Native 단에 있는 foo 라이브러리의 CodeCheck 클래스의 bar 함수를 불러와서

 

입력한 값이 맞는 지 틀린 지 확인을 하는데

 

이 bar 라는 함수에 C 언어로 된 문자열 비교 함수 strncmp 사용한다는 것까지 알아냈습니다!

 

출처: https://modoocode.com/90

 

 

어떤 인자를 사용하는지 보자구요..! 2가지 중 하나는 비교 대상 문자열이죠?

 

내가 입력한 값, 비교할 문자(정답), 문자열 길이

 

* 첫번째 자리에도 정답이 올 수 있는데, 시간 절감을 위해서 제가 첫번째 인자 자리에는 제가 입력한 값이 온다는 것을 알았기 때문에 두번째 자리에 정답이 온다고 미리 알고서 넘어갑시다!

 

이 3가지를 인자로 받으니 우리는 비교할 문자를 찾아내면 되겠습니다!

 

 

Step 10. 거의 다 왔습니다.

 

이제 frida 서버를 실행하고 앱을 실행해보겠습니다.

 

 

 

 

3. 후킹 코드 작성 및 설명

 

Uncrackable Level 2 앱을 실행하면 루팅이 탐지되었다며 앱을 바로 종료 시킬겁니다!

 

그 때는 당황하지 마시고 Level 1에서 사용했던 Java의 Exit 함수 후킹하는 코드를 그대로 사용하시면 되겠습니다.

 

 

 

Step 1. 이제 새로운 방식으로 후킹을 해보도록 하죠..!

 

Frida 공식 문서를 참고하겠습니다.

 

Interceptor.attach 함수를 사용하는데,

 

첫번째 인자는 Module.getExportByName 함수를 사용하는군요..!

 

Module.getExportByName 함수는 대상 동적 라이브러리 파일(so 파일)과 그 안의 함수를 적어주면 되나 봅니다..!

 

 

 

위와 같은 형태로 사용하고 후킹 대상 함수 진입 시에, 혹은 벗어날 시에 어떤 동작을 취할 지 명시할 수 있는데요.

 

 

이 기능들이 얼마나 유용한지는 사용하면서 확인해보겠습니다.

 

아래 간단히 표로 정리해보았습니다.

 

onEnter 후킹 대상 메소드 진입 시에 동작하는 코드를 코드 블럭 내에 명시, 함수 인자 값 확인 가능
onLeave 후킹 대상 메소드를 벗어날 시 동작하는 코드를 코드 블럭 내에 명시, 함수 반환 값 확인 가능

 

 

우선 오늘은 onEnter만 사용할 거에요.

 

이유는? 우리는 아까 말했듯이 인자로 받는 비교할 문자만 알아내면 되기 때문이죠!

 

 

 

Step 2. 깔-끔! 위에 나온 그대로죠? 추가해봤습니다.

 

 

조금 헷갈릴 수 있는 것이 있는데 이 부분만 짚고 넘어가죵

 

 

인자가 몇개 든 args 라는 하나의 배열 형식으로 함수 내에 전달합니다.

 

우리는 아까 strncmp 함수가 3개의 인자를 받는 다는 것을 확인했고,

 

인자의 순서가 0번째 부터 시작하므로 2번째는 마지막인 세번째 인자가 되겠지요?

 

대상 문자열의 길이 먼저 확인합시다.

 

하지만 여기 인자들은 바이너리 형식이기 때문에 우리가 해석할 수 있는 정수 형태로 변환하기 위해서는

 

toInt32 라는 함수로 변환해줘야 합니다..!

 

 

오우오우 싸발적이고!(1)

 

 

 

console.log는 그걸 출력하겠다는 것이구요..!

 

 

한 번 실행해볼까요?

 

 

Step 3. 아~무 의미없는 test string 이라는 문자열을 입력하고 VERIFY 버튼을 클릭합니다.

 

 

 

 

또 저 보기 싫은 Nope 이라는 글자가...

 

제발 그만.. 나 죽어!!!!!

 

하지만..! 실행한 화면에서는 엄청난 숫자들이 촤르르 펼쳐지면서 당황하게 만드는 데요..!

 

왜냐하면 이 앱이 실행되는 동안 strncmp라는 함수가 실행되기만 하면 다 저 마지막 인자를 출력해서 그렇습니다..!

 

우리는 CodeCheck 클래스의 bar라는 메소드가 사용하는 경우에만 딱 후킹을 하고 싶기 때문에

 

저 메시지 박스의 OK 버튼을 클릭한 시점에서 가장 마지막으로 출력된 숫자가 우리가 찾는 정답의 길이라는 것을 알 수 있죠..

 

실제로 저 버튼을 클릭한 이후 화면은 잠잠합니다

 

 

너 이 녀석..! 23 글자 였구나?!

 

Step 4. 이제 길이를 알아냈으니까 조건을 더해서 args[2] 가 23인 경우에만 동작하도록 조건을 더하고, 정답인 args[1]을 출력해볼까요?

 

 

마지막 추가입니다..

 

더 이상의 사리추가는 없을 것 (제 친구가 둘이서 곱창 3인분에 라면 사리 3개째 추가하면서 남긴 말입니다.. 레알임)

 

 

조건은 args[2] 가 23일때 만 동작하도록 코드블록을 나눌 것이니까..!

 

if(args[2].toInt32() == 23) {  조건이 맞으면 여기!가 실행  }

 

이렇게 나누는게 맞겠죠?

 

 

이제 우리는 숫자가 아닌 문자를 우리가 아는 형태로 바꿔야 하니까(args[2]와 마찬가지로 바이너리기 때문에 변환해줘야 합니다)

 

Memory.readUtf8String 함수를 사용하는 겁니다..!

 

 

 

간단하게 번역하면 해당 위치의 바이트 데이터를 읽어서 ACSII, UTF8 등과 같은 우리가 아는 언어(영어겠죠?) 형태로 변환해주는 함수 라고 하네용

 

 

Step 5. 실행!!

 

은 바로 다음 챕터에서 하도록 하죠!

 

후후.. 막상 끝내려니 아쉽달까

 

 

 

 

 

4. 후킹 결과 확인

 

Step 1. 다시 데이터를 입력해보죠... Nope 이 너무!!!! 보기 싫지만 ...

 

 

 

 

Step 2. 우리는 입력한 데이터가 23 자리 라는 것을 알기 때문에 23자리에 맞춰서 입력해보겠습니다..

 

제가 계란을 좋아하는데(단백질 이라서) 계란을 23개 넣는다는 생각으로 0을 23개 넣어보겠습니다..

 

 

 

자.. Frida 실행 화면에는 어떤 일이 일어났을까요?

 

 

 

뭔가..!! 뭔가가!!!!!!! 나왔다!!

 

 

 

마치.. 동숲에서 고래상어를 낚은 듯한 기분!! 김옥지!!!!

 

 

Step 3. 자.. 고래상어를.. 아니 획득한 데이터를 넣으면 이렇게... Success 라는 너무 기분 좋은 단어가 표시됩니다!

 

 

 

 

감사합니다.

 

 

정신없었지만 정리를 해보자면

 

요약

1. 안드로이드 애플리케이션에는 Java 뿐만 아니라, 뛰어난 성능을 위해 C/C++ 도 사용한다.

2. Native란 이 C/C++ 로 구현된 부분을 의미한다.

3. C/C++로 구현된 코드들이 모여있는 파일이 so 파일이다.

4. Frida로 Native 로직도 후킹할 수 있다. (Uncrackable Level 2가 만들어진 목적)

 

 

 

 

 

오우오우 너무 좋고!

 

긴 장마가 끝났습니다. 무더운 날씨지만 간만에 맑은 햇살이 가만히 있어도 기분 좋게 만들어주네요.

친지 및 가족들과 더위를 피해 시원한 곳으로 피서 는 무슨 코로나 위험하니 집에 계셔요!

 

감사합니다.

 

 

References 참고 문헌

 

'Hooking' 카테고리의 다른 글

0x02 - Frida Hooking: 가슴이 웅장해지는 후-킹  (6) 2020.07.15
0x01 - Frida Hooking: 거대한 전쟁의 시작  (4) 2020.06.20
0x00 - Frida Hooking  (0) 2020.05.29

관련글 더보기