[iOS] decrypting an iOS app binary file

silver35·2023년 4월 9일
0

iOS

목록 보기
3/3

iOS에서 앱 복호화 시 CrackerXI 트윅을 이용한 방법 등이 있다. 그런데 복호화가 잘 안되는 앱들도 있어서 이를 수동으로 복호화를 해보려고 한다.

iOS 앱 바이너리 파일 암호화 정보 확인

앱 바이너리 파일을 추출해 ida로 분석하려고 하면 아래와 같이 iOS 파일이 암호화 되어있다고 나온다.

복호화 하고 싶은 앱 바이너리 위치에서 이진 파일의 암호화 정보를 확인하기 위해 iOS 단말기에서 아래와 같은 명령어를 실행한다. "LC_ENCRYPTION_INFO_64"는 Mach-O 파일 포맷에서 사용되는 load command의 하나로, 이진 파일의 암호화 정보를 나타낸다. 결과를 보면 135168(0x21000)부터 총 4096(0x1000) 크기만큼 암호화가 되어있다는 것을 알 수 있다. 즉, 0x21000 부터 0x22000까지 암호화가 되어있다.

otool -arch all -Vl {앱바이너리이름} | grep -A5 LC_ENCRYPTION_INFO_64

참고) otool은 iOS 운영체제에서 실행 파일과 공유 라이브러리의 object 파일을 분석하는데 사용된다. [iOS] otool 사용법

Frida로 앱의 base 주소 확인 및 메모리 덤프

그런 다음 Frida를 이용해 앱의 프로세스 시작 주소를 가져온다. 아래 코드는 Frida 스크립트에서 현재 대상 프로세스 내에 적재된 모든 모듈을 나열하고, 이를 module_list변수에 저장한 뒤, 이를 send()함수를 사용하여 대상 애플리케이션으로 전송하는 코드이다.

function getaddr(){
    var module_list = Process.enumerateModules();
    send(module_list);
}
getaddr();

//frida -U -f  {앱 패키지명} -l process.js

따라서 앱은 0x104140000 + 0x21000 ~ 0x104140000 + 0x22000만큼 암호화가 되어 있다는 것을 알 수 있다. 즉, 0x104161000 ~ 0x104162000만큼 암호화가 되어 있다. 이 후 실행중인 프로세스의 메모리 덤프를 진행한다.

메모리 덤프 후 덤프 파일에서 0x104161000에 가장 가까운 0x104108000 파일을 연다.

0x104161000 - 0x104108000은 0x59000임으로 0x59000(364544)부터 0x60000(393216)까지 덤프 파일을 복사한다.

복호화된 hex값 적용 및 LC_ENCRYPTION_INFO_64 변조

기존 바이너리 앱을 hex editor로 열어서 0x104161000 ~ 0x104162000 암호화된 부분을 위에서 복사한 복호화된 hex값으로 붙여넣기 해준다. 그 다음 바꾼 ipa파일을 ida로 열어준 후 View > Open subviews > Segments > Header에서 LC_ENCRYPTION_INFO_64를 찾은 다음에 1(암호화)로 설정된 것을 0(암호화 x)으로 바꾼다.


그 다음 패치한 프로그램을 저장하면 복호화가 완료된다. 암호화되어있을 때 볼 수 없었던 함수들을 볼수 있게 되었다. 이제부터 분석을 시작하면 된다!

0개의 댓글