우선 ipa 파일을 압축 해제 후, 바이너리 파일을 IDA에 로드하여 strings (Shift + F12) 기능을 통해 팝업 메시지의 문자열을 검색했다.
위 문자열을 더블 클릭하여 이동하고, Ctrl+x 를 누르면 해당 문자열이 참조되는 위치를 추적할 수 있다.
문자열이 호출되는 곳으로 추적해서 올라가보면 TBZ 명령어를 통해 분기가 이뤄지고 있으며, 이를 TBNZ로 바꿔주기만 하면 로직이 반대로 동작한다. 해당 구문을 변조하기 위해 TBZ 명령어 부분을 선택하고 Hex View 탭을 연다.
Hex View에서 Edit 모드로 전환(F2) 하여 명령어에 해당하는 Hex값을 수정하고 다시 Apply changes(F2)를 눌러 수정을 완료하면 된다. Hex값은 armconverter 를 참조했다.
ARM Converter
수정 된 내용을 실제 바이너리 파일에 적용하게 위해 Edit > patch program > Apply patches to input file 에서 패치를 진행한다.
다시 ipa 파일로 묶는 법은 기존 바이너리가 포함되어 있는 Payload 폴더를 .zip 으로 압축하고 .ipa 로 확장자를 변경하면 된다.
생성한 ipa를 다시 단말기에 설치하면 로직이 변조되어 'Device is Not Jailbroken' 메시지를 확인 가능하다.
Device is Not Jailbroken
2. radare2를 이용한 바이너리 변조
마찬가지로 우선 ipa 파일의 압축을 해제하고, radare2를 이용해 바이너리 파일을 쓰기 모드로 연다.
izzq 로 메시지 발생하는 문자열의 주소값을 확인하고, axt 를 통해 해당 문자열을 참조하는 위치(xref)를 찾아 이동한다.
VV 로 Visual Mode 로 전환 후 tbz 명령어를 통해 조건분기되고 있음을 확인하고, Shift+Tab을 눌러 상위 노드를 선택했다. (아래 사진을 자세히 보면 선택된 노드는 점선으로 된 테두리가 노란색으로 보인다)
q 를 두번 눌러 Visual Mode를 다시 빠져나온 후 pd 명령어를 통해 해당 tbz 구문의 주소값과 명령어(hex값)을 확인한다.
radare2에서는 패키지에 함께 포함된 rasm2 을 통해 명령어 인/디코딩이 가능하기 때문에 armconverter가 필요없다. rasm2 을 통해 tbz 구문에 해당하는 hex값을 디코딩하여 구문의 형태를 확인하고, 반대로 동작하도록 opcode만 바꿔서 wa로 해당 위치에 덮어 씌워주면 된다.
패치 되어서 rasm2 조차 필요없게 되었다.
> wa tbnz w0, 0, 0x1001cc17c
별도의 변환 과정 없이 위 명령어로 패치하면 된다.
패치한 바이너리를 포함하여 Payload 폴더 압축 후 .ipa 로 확장자를 바꿔 단말기에 설치하면 패치가 정상적으로 이뤄진 것을 확인할 수 있다.