22. Application Patching 2
[목차]
2. 실습
- Check For Jailbreak
- Show Alert
- Kill Application
3. 대응 방안
2. 실습
2-2) Check For Jailbreak
목표: 디바이스가 Jailbreak 되지 않았음을 항상 반환하도록
Jailbreak 된 디바이스 검사 로직 패치
ㄱ. 힌트 확인
Check For jailbreak를 누르면
![](https://blog.kakaocdn.net/dn/lh1WA/btrR8y6pZMd/x7wvWw7315hFhLTOadWfl0/img.png)
탈옥 탐지가 되는데
해당 문구를 힌트 삼아 해결책을 찾아본다.
ㄴ. 분석
키워드로 분기점 확인
![](https://blog.kakaocdn.net/dn/cKqPWT/btrR9cV4XaZ/YlDvXXaRbj6gt0cb1O0aCk/img.png)
![](https://blog.kakaocdn.net/dn/cTgM96/btrR9XYq8IG/34gJM6fvDYzzRb6mXANnl1/img.png)
w0 레지스터 값이 0x0인 경우
1001cc17c로 분기를 하는데
현재 값이 0이 아니기 때문에
우측, 탈옥 탐지됨! 블럭으로
넘어가고 있다.
프리다로 w0 값을 확인해 본다.
ㄷ. 레지스터 값 확인
먼저 분기점 주소 확인 후
![](https://blog.kakaocdn.net/dn/cgKLNv/btrR9YiIwqo/NCPT1X3w7mPTBevNKQhM9K/img.png)
코드 작성
var realBase = Module.findBaseAddress('DVIA-v2')
console.log("[+] 실제 앱 주소 : " + realBase)
var Patching_point = realBase.add('0x1cbdd0')
console.log("[+] 분기점 주소 : " + Patching_point)
Interceptor.attach(Patching_point,{
onEnter:function(args){
console.log("[+] w0 레지스터 값 확인 : ")
console.log(JSON.stringify(this.context))
}
})
돌려보면
![](https://blog.kakaocdn.net/dn/yvgWg/btrSaI7AceU/6hFaF2kpMQka8yI9Ri4dD1/img.png)
w0 값이 1이다.
w0 값이 0인 경우
탈옥 아님!으로 빠지게 되는데
해당 값이 1이니
w0을 1로 바꾼다.
ㄹ. w0 레지스터 값 패칭
변조 전
![](https://blog.kakaocdn.net/dn/bfRPQI/btrSeimK8dZ/ydIQb9qkFyK46tKfGyBlmk/img.png)
변조 후
![](https://blog.kakaocdn.net/dn/JDItQ/btrR8w8EnmO/KGLAKhhqAqucumIE7oVUWK/img.png)
ㅁ. 패칭 여부 확인
패칭된 바이너리 추출 후 replace,
앱을 실행하면
![](https://blog.kakaocdn.net/dn/pLGZ3/btrSa6AzmaK/Z5RyK6KgreQxdQz8dnxmZ1/img.png)
패치가 정상적으로 이루어져
Device is Not Jailbroken이 뜬다!
탈옥 탐지 우회
바이너리 패치 성공!
2-3) Show Alert
목표 : I love Google 대신
I Love Apple 메시지가 항상 표시되도록
메소드 패치
실습 툴 : Hxd Editor
https://mh-nexus.de/en/downloads.php?product=HxD20
바이너리 Import 후
I love Google 검색,
![](https://blog.kakaocdn.net/dn/cBxPon/btrSaJ6vRPB/VvwNFaCyr2FJK7dmTMj9FK/img.png)
해당 부분을 Apple로 변조,
![](https://blog.kakaocdn.net/dn/bCAOfp/btrSar50fzL/FrqW6gdn82B8uUCtk3njm1/img.png)
글자가 하나 남는데
남는 e 글자 바이너리 값인 65를
00으로 바꿔주고
![](https://blog.kakaocdn.net/dn/Q4OFY/btrR9d1MeLw/IZYvEbz43vr1Rtv1Rn8qnK/img.png)
패칭된 바이너리를 export,
replace 후 돌려보면
![](https://blog.kakaocdn.net/dn/H0CQU/btrSeOsoPmg/FHrUBRVbqmkWje4nlmG8rk/img.png)
바이너리 패칭 성공!
2-4) Kill Application
목표: DVIA-v2 앱의
Application Patching > Kill Application 항목을 누르면
앱이 강제 종료되는데 종료되지 않도록 메소드 패치
ㄱ. 힌트 찾기
기드라에서 키워드 검색 (Kill, exit 등)
![](https://blog.kakaocdn.net/dn/bsupUa/btrR9F4MCI8/lTDyVluBk0XZ5MDLtWb9G0/img.png)
![](https://blog.kakaocdn.net/dn/2tWAL/btrR9u96dJN/xHBbinm7ZkbGgzhxtfmrF1/img.png)
_exit 부분이 의심스럽고
더블클릭 후 들어가 보면
![](https://blog.kakaocdn.net/dn/dHHXXA/btrSdaPZr16/kp9b8QWskesqoLbowUSX8k/img.png)
앱 종료 코드 및
참조하고 있는 곳 확인이 가능하고
패칭이 필요한 곳은 마지막의
ApplicationPatching 부분일 것이다.
더블클릭 후 들어가면
![](https://blog.kakaocdn.net/dn/ph71k/btrSca3NFNY/DM3OhU7O4eCuSq2yZYGrX0/img.png)
bl이라는 어셈블리 코드 확인이 가능한데
(bl : 지정된 곳으로 분기시키는 명령어)
해당 어셈블리 및 관련 기능을 사용하는
부분들을 모두 NOP으로 변조해 주면
아무런 동작을 하지 않게 될 것이다.
![](https://blog.kakaocdn.net/dn/bOapVS/btrSahCmvEc/vo9mbKMKnOOozUdoHzbUrk/img.png)
![](https://blog.kakaocdn.net/dn/udhpf/btrR8J7U5xz/rVL4MyeiBTBbENySQejNGK/img.png)
마지막 ret는 남겨두고
모두 nop 처리 후
해당 바이너리로 replace 후
실행해 보면
kill을 마구 눌러도 종료되지 않는다!
![](https://blog.kakaocdn.net/dn/cqWNP1/btrSc9Q5vVc/juGGKE6gNq5MWk4CNSe9C1/img.png)
바이너리 패칭 성공!
3. 대응 방안
위변조 탐지 : 애플리케이션 바이너리 해시 값 검증 (코드 무결성 검증)
• 악성코드 삽입 및 실행, 보안 솔루션 우회, 인증 절차 우회 등
![](https://blog.kakaocdn.net/dn/dEFCc1/btrScavXxDx/vCgwHTkrDOEhL5gDKHUpYk/img.png)
[도움 출처]
: 보안프로젝트 김태영 팀장 iOS 모바일 앱 모의해킹(기초) 강의