티스토리 뷰
안녕하세요.
광주아이입니다.
아이폰(iOS), 안드로이드폰(Android) 후킹(Hooking)에 대해서 #1
에 이어서 #2를 작성해보려합니다.
본 문서는 다시 말씀드리지만
연구용도로 작성되었으니 연구용도로만 봐주시면 정말 감사하겠습니다. :)
(직접 트윅을 제작하시거나 우회할 수 있는 방법은 드릴 수 있습니다.)
#1에서 말씀드린 루팅/탈옥 탐지 우회를 완벽하게 방어하는 방법이 없다고 말씀드렸습니다.
보통
아래와 같은 방법으로 루팅/탈옥을 탐지 하는데요.
Android : /bin/su, /xbin/su, magisk, XposedBridge ..... (루팅 관련 superuser 권한의 바이너리 혹은 프레임워크)
iOS : /bin/su, /system/cydia.log, MobileSubstrate, TweakInject.dylib...... (탈옥 관련 superuser 권한의 바이너리 혹은 프레임워크)
가 있냐 없냐
pthread_create() 함수를 이용해서 쓰레드가 생성이 되었냐
수 많은 앱의 루팅/탈옥 탐지 우회를 하다보니 대표적인 시스템 관련 함수를 예로 들었습니다.
#1의 답을 드리자면
위의 함수의 리턴값 또는 위의 파일들이 실제 존재해도 안 보이게끔 하면 끝이라는 겁니다.
자 그럼 어떻게 안 보이게 할거냐
물론
Android - Xposed Framework
iOS - Cydia Mobile Substrate
의 아주 좋은 트윅을 이용해서 함수 후킹이 들어간다는거죠.
iOS 의
NSFileManager Class 의 fileExistsAtPath 라는 함수가 있습니다.
인자로는 파일명이 들어가고요.
리턴은 boolean 입니다.
함수 원형은 다음과 같습니다.
- (bool) fileExistsAtPath:(NSString *) path
실제 디바이스 내의
/private/var/stash 라는 파일이 존재를 하면 이 함수는 YES를 리턴할 것이며
탈옥되었다 라고 사용자한테 알려주겠죠.
눈치 빠르신 분들은 이미 이해하셨을 거에요.
NSFileManager 라는 클래스의 fileExistsAtPath를 후킹하면 된다는 얘기입니다.
이 함수에 후킹을 걸고
인자(path) 의 값이 들어오면 NO를 리턴해주면 없다고 판단하겠지요.
if([path isEqualToString:@"/private/var/stash"]) {
return NO;
}
이렇게요.
하지만 이런거 가지고 탈옥이 되었다 안되었다 판단하기에는 좀 그렇죠?
그래서 개발자들은 사용자 함수를 이용해서 앱의 흐름 파악이 어렵도록 만들고 있습니다.
디버거(전 IDA)로 디버깅을 해보면 다음과 같은 화면을 줄 곳 보실 수 있을거에요.
대략적으로만 봐도 fileExistsAtPath 함수로 먼가가 하는거 같지요?
바로 Data 영역에 저장돼 있는 탈옥관련 파일들을 손 볼 수 있는 사용자 함수의 내부 입니다.
이 사용자 함수를 후킹을 해보겠습니다.
실제 이 앱은 시중에 나와있는 앱의 사용자 함수이구요.
이 사용자 함수의 리턴은 정상 : 0, 비정상 : 0이 아닌 정수형
이다 라고 판단을 할 수는 있습니다.
Mobile Substrate
Tweak.xm
int (*orig_100032EA4)(void); // original 함수 원형
int sub_100032EA4(void) // original 함수를 대체할 함수
{
return 0;
}
%ctor
{
unsigned long test1 = _dyld_get_image_vmaddr_slide(0) + 0x100032EA4; // 해당 주소(번지)에 이 함수를 덮어 씌워주는 변수
MSHookFunction((void *)test1, (void *)sub_100032EA4, (void **)&orig_100032EA4);
}
이제 이 original 함수는 int sub_100032EA4라는 함수로 대체되게 됩니다.
너무 깔끔하게 후킹이 되어버렸죠?
(하지만 앱이 업데이트 되면 해당 번지수는 존재하지 않거나 내용이 바뀌어 버렸으니 다시 만들어줘야 합니다.)
여기서 집고 넘어가야 할 함수가 하나 존재하죠?
바로 함수를 후킹할 수 있는 MSHookFunction 설명은 아래 주소에서 들으실 수 있습니다.
http://www.cydiasubstrate.com/api/c/MSHookFunction/
여기 보시면 아주 자세하게 Example 코드까지 나와있습니다.
참고하시면 큰 도움이 되시리라 생각합니다.
여기까지 잘 읽으신 분은 직접 따라해보셔도 좋으실 듯 합니다.
보안쪽에 일하시는 분들은 예전부터 창이 먼저냐 방패가 먼저냐 라는 말을 많으 들으셨을겁니다.
저번에도 제가 말씀드렸다시피
저는 창이 먼저라 생각되어집니다.
어떻게 뚫었냐에 대한 답은
방패 +1 스킬업
이라는 거죠.
공격이 없으면 굳이 방패가 있을 필요가 없다라고 생각합니다. (쉴드까지는 허용하겠습니다.)
어마어마한 공격을 보안담당 및 개발파트에서 종사하시는 분들이 참고하셔서
이 시대에 IT 강대국이 되지 않았나 싶습니다.
#3에서는 Android 쪽도 다뤄볼 것입니다.
Android도 물론 잘 막을 수 있냐?
...
...
...
...
...
...
...
...
...
...
물론 없습니다.