[IOS] IPA 파일 Binary Patch.
IPA의 Binary Patch를 통해서 ARM Assembly로 구성된 코드 자체를 수정해 내가 의도한 실행흐름으로 바꾸게 된다. Binary Patch를 하게되면 무결성 검증에 걸리기 때문에 무결성 검증이 기본적으로 우회가 되어있어야 한다.
( 무결성 검증 이전의 동작에 대해서는 Binary Patch를 통해서 수행이 가능하다. )
Binary Patch를 수행하는 과정을 살펴보자.
사용한 앱은 DVIA에서 제공하는 앱이며, Runtime Manipulation Login Method1에 대해서 진행했다.
1. IPA 추출(Decrypt)후 Binary File을 IDA에 올린다.
IPA 파일를 CrackerXI를 통해서 Decrypt한 후 추출한다.
왼쪽에 정상적으로 복호화된 API를 확인할 수 있다.
2. Patch할 곳을 찾고 RVA를 파악한다.
isLoginValidated 함수의 반환값을 통해 결과가 달라진다는 것을 확인할 수 있다.
기본적으로 무조건 0을 반환하도록 되어있다. Binary Patch를 통해 반환 값을 1로 변경해보자. 우선 이 부분의 RVA를 파악해본다.
MOV W0, #0 을 MOV W0, #1로 수정할 것이므로 해당 명령어의 RVA를 찾으면된다.
SpaceBar를 눌러서 해당 명령어의 주소를 0x100007774인 것을 확인할 수 있다. Base Address가 0x100000000임으로 0x7774가 RVA가 된다.
3. Patch할 곳을 바꿀 명령어의 HEX값을 구한다.
armconverter
armconverter.com
에서 ARM 명령어를 HEX값으로 바꿀 수 있다.
4. HEX Viewer로 Binary File을 열고 2번에서 봐둔 RVA를 확인한다.
IDA로 봤을 때랑 동일한 HEX값인지 확인하는 것도 잊지 말자!!
어째서 이렇게 다르지.... 마지막 3Byte는 똑같긴하다.. 다른앱에서는 똑같았는데 ㅠ_ㅠ Ctrl + F를 통해서 해당 Binary의 주변 HEX값들을 비교하며 찾았다.
5. 3번에서 구한 HEX값을 해당 위치에 덮어써서 Patch를 진행한다.
수정한 Binary File을 다시 IDA에 올려서 정상적으로 변경됐는지 확인한다.
( Binary File이 커지면 이를 확인하기 어려울 것 같다...? IDA 여는것만 한세월ㅠㅠ )
6. 3uTools로 원본 Binary File과 수정한 Binary File을 iphone에 넣는다.
7. SSH를 통해 iphone에 접속해 다음 명령어들을 수행한다.
ldid -e [원본 Binary File] > ch4njun.xml
chmod +x [수정된 Binary File]
ldid -Sch4njun.xml [수정된 Binary File]
이 과정을 거치지 않으면 수정한 APP이 켜자마자 꺼진다.
8. 3uTools로 수정한 Binary File을 PC로 추출한다.
9. 추출한 Binary File을 기존 IPA 폴더에 덮어쓰고 압축후 확장자를 .ipa로 변경한다.
( 반드시 최상위에 payload 디렉토리가 와야한다. )
10. 생성된 IPA 파일을 3uTools를 사용해 iphone에 설치한다.
11. 설치된 APP을 실행하면 return 1에 의해서 Login에 성공하는 것을 확인할 수 있다.