Extract & Decrypt IPA from iOS 11 with bfinject
이번 포스팅에서는 iOS 어플리케이션을 추출 및 분석하는 방법을 알아봅시다.
개요
iOS 어플리케이션을 분석하기 위해서는 가장 먼저 .ipa 파일을 얻어내야 합니다. 해당 파일은 안드로이드의 .apk 파일과 상당히 유사한데요, 한 마디로 실행 파일 등을 포함하고 있는 아카이브 파일인 셈입니다. .ipa 파일 안에는 실행 가능한 ARM 아키텍쳐 기반의 바이너리가 포함되어 있는데 대부분의 경우 하나로 통합되어 있으며, iOS에서만 설치될 수 있다고 합니다.
안드로이드는 앱의 APK 파일을 추출하기 쉬운 편입니다. APK Extractor 등의 도구로 손쉽게 추출이 가능하죠. 그리고 압축을 해제해서 디컴파일러를 통해서 소스코드를 파악하기도 편리하죠. 그렇지만 iOS는 IPA를 GUI 등으로 쉽게 추출해주는 앱이 존재하지 않을 뿐더러, 버전별로, 그리고 탈옥 여부 등에 따라서 방법이 상이합니다.
따라서 아래에서 소개드릴 방법은 여러분들의 단말에는 적용되지 않을 수 있음을 미리 알려드립니다. 해당 포스팅은 iOS 11.2.6 버전, iPhone 8, Electra 1.0.3을 이용하여 탈옥된 단말에서 진행하였습니다.
IPA 파일 추출
저는 처음에 2가지의 방법으로 IPA 파일을 추출하였습니다. 첫 번째는 앱이 설치된 경로를 찾아서 바이너리의 위치를 찾아 .app directory를 획득하여 IPA로 압축, 추출하는 방법이었습니다. 두 번째로는 Apple Configurator 2 라는 프로그램이 업데이트를 제어할 때 생기는 cache를 토대로 IPA를 추출하였습니다. 그러나 두 가지 방법 모두 결국에는 실패하였는데, 결론부터 말씀드리자면 바이너리가 iOS-Encryption에 의해 암호화되어있기 때문이었습니다.
기본적으로 애플의 DRM시스템에 의해서 iOS 어플리케이션이 보호를 받습니다. 해당 시스템은 어플리케이션의 특정 세그먼트를 암호화함으로서 악성 사용자가 앱을 분석하기 어렵게 만듭니다. 그러나 탈옥된 단말에서, 여러가지 기교를 통해 이러한 시스템을 무력화하고 암호화되지 않은 바이너리를 얻어낼 수 있는 방법이 있습니다. 단순히 바이너리 뿐 아니라 IPA 파일 전체를 얻어낼 수가 있죠.
bfinject
bfinject는 탈옥된 iOS 11.0 - 11.1.2 버전에서 작동하는 동적 라이브러리 인젝션 도구입니다. Electra 및 LiberiOS 탈옥 모두에 호환되며, 사용하기가 쉽습니다. 그런데 Electra 신형 버전에서는 작동하지 않는 문제 등이 있다고 합니다. 저는 이런 부분을 조금 수정한 fork된 버전의 bfinject를 사용하였습니다. iOS 11.2.6 버전에서도 정상 작동하는것도 확인하였습니다.
bfinject의 기능중에는 암호화되지 않은 바이너리를 덤프하여 사용자에게 제공하는 기능도 있습니다. 저는 바로 이 기능을 이용해서 IPA파일을 추출할 예정입니다. bfinject 실행중에 특정한 유닉스 유틸리티가 없다는 오류메시지가 뜰 때가 있는데, 이 경우에는 Cydia에서 패키지를 업그레이드하거나 해당 유틸리티를 찾아서 설치하면 올바르게 동작합니다.
github의 예제로 올라온 Reddit 어플리케이션에 대해서 진행해 보겠습니다. 먼저 아이폰으로는 해당 앱을 실행합니다. 그 뒤에 ssh로 연결하여 bfinject를 다음과 같이 실행합니다. 아이폰으로 앱을 실행한 상태여야 받아올 수 있으며, 못찾아 올 경우에는 ps aux | grep <application name>
명령어를 활용하여 PID를 가져와서 -p <PID>
로 대신 어플리케이션을 찾으면 됩니다.
bash bfinject -P Reddit -L decrypt
그러면 아이폰에 다음과 같은 화면이 뜹니다.
YES를 누르면 해당 포트로 IPA를 제공합니다. 그럼 이제 맥 터미널로 돌아와서 netcat을 이용해 파일로 받아오면 됩니다.
네트워크 상황에 따라서 다르지만, 일반적으로 사용하는 개인용 무선 네트워크라면 크게 오래걸리지는 않습니다. 단, 파일의 크기가 작지는 않기때문에 공용 네트워크를 사용할때에는 속도가 느릴 수 있다는걸 유념하시기 바랍니다. 그리고 공용 네트워크에서 openSSH 서버를 열어둔 아이폰은 루트 비밀번호를 필히 바꾸셔야 보안 사고가 발생하지 않습니다.
이렇게 IPA를 얻어내면 단순히 압축을 해제하고 보면 안에 있는 패키지에서 바이너리를 찾을 수 있습니다. 암호화 되어있지 않기때문에 IDA 등으로 분석이 가능해집니다. 이번 포스팅은 여기서 마치겠습니다.