티스토리 뷰
안녕하세요.
광주아이입니다.
요 두 녀석 때문에 다시 한 번 글을 쓰게 되네요.
죄송한 말씀이지만 의뢰 또는 소스는 공개할 수 없는 점 이해해주시리라 믿겠습니다.
다시 말씀드리지만 금융거래가 이루어지는 앱에서
연구 목적(루팅/탈옥, VPN탐지, 무경성체크, SSL Pinning 등)으로 우회 시도를 할 뿐 저는 나쁜놈이 절대 아닙니다.
꼭 이해해주세요.
본론으로 들어가겠습니다.
저는 앱 취약점 진단을 목적으로 연구하고 있으며, 루팅/탈옥이 된 실제 단말기에서 테스트를 진행하고 있습니다.
그 이유는 슈퍼유저(root) 권한이 있어야지만 취약점 진단이 가능한 내용이 있습니다.
일반 사용자 권한으로는 접근이 어렵습니다.
메모리(스캔, 변조), 무결성, 저장된 데이터 확인, SSL, VPN, Proxy 등 이 내용들을 파헤쳐 보려면
루팅/탈옥 탐지 우회가 선행 연구돼야 합니다.
그래서 루팅/탈옥이 된 안드로이드폰(갤럭시 S6), 아이폰(iOS 11.4.1)으로 테스트를 합니다.
준비물은 앞서 게시물에 작성했듯이
공통 : 루팅/탈옥이 된 단말기, Trace가 가능한 디버거
안드로이드 : Xposed Framework
아이폰 : Mobile Substrate
가 필요합니다.
직접적으로 후킹도 할 수는 있지만
안드로이드의 경우 특정 시스템 라이브러리의 함수를 후킹하면
이름으로만 후킹이 진행되기 때문에 모든 앱에게 의도하지 않은 악영향을 줄 수 있습니다.
Xposed Framework(Android), Mobile Substrate(iOS for Cydia)를 이용합니다.
두 디바이스 모두 특정 패키지 이름으로 된 앱만을 검색하게 되며
특정 클래스의 함수를 후킹하게 됩니다.
보통 루팅/탈옥 함수의 원형을 보자하면
private(public) boolean isRooting
private(public) boolean isJailbreak
보시다시피 boolean 형태의 참과 거짓으로만 판단하는 앱이 다반수이며
물론 그렇지 않은 앱들도 많습니다.
시스템 라이브러리의 ptrace, pthread_create, fork, fopen(su, sshd 등) 함수 등으로
누군가 나를 Attach 하거나 자식프로세스가 생성이 되거나 혹은 루팅/탈옥 시 필요한 슈퍼유저 권한의 파일들이 존재하거나
입니다.
이 시스템 함수를 만지는 사용자 함수를 건드리거나
혹은 앱을 구동시킬 시 onCreate 함수에서 직접 호출 할 경우
위 함수들의 리턴값을 원하는 값으로 직접 변경을 해줘야 합니다.
예를 들면
정상적인 디바이스에서는 슈퍼유저의 권한이 없기 때문에 에러코드를 리턴할 것이고,
루팅/탈옥이 된 디바이스에서는 Thread를 식별할 수 있는 코드를 저장 후 0을 리턴하게 됩니다.
실제 루팅/탈옥이 된 단말기에서 위와 같은 사용자 함수가 실행이 될 경우
0이 리턴되더라도 Thread 식별 코드가 존재하지 않기 때문에 디바이스는 정상폰이다 라고 판단하게 되는거지요.
정리하자면
정상적인 사용자함수를 건드려
pthread_create 값을 강제로 0 또는 에러값으로 변경하게 되면 된다는 것입니다.
다른 시스템 함수도 마찬가지로 에러값이 아닌 정상값이 떨어질 경우 루팅/탈옥폰이다
인지를 하게되어 앱이 종료되어 진다(?) 판단하게 되는 것이지요.
그러면 루팅/탈옥 탐지 우회를 막으려면 도대체 어떻게 해야할까요?
정답은..............
...
...
...
...
...
...
...
...
...
...
안타깝게도 없습니다.
왜 없는지는 다음 포스팅에서 알려드리겠습니다.