주소값 변조를 통한 탈옥 탐지 우회는 사실 국내 자료도 해외 자료도 없고 또 어셈블리를 잘몰라서 정확한 리턴도 구해내기가 어렵다.
하지만 몇번의 연구끝에 탐지 로직 우회가 가능한 것을 발견했고,
아직 완벽하진 않지만 추후에 어셈블리를 좀 더 공부하게 된다면 다시 연구해볼만한 가치가 있다.
먼저 탐지 우회의 원리는 간단하다.
CBZ 분기문은 결과값이 0이냐 아니냐를 확인 후 분기한다.
그래서 기존에 알고있던 방식의 바이너리 변조방식으로는 CBZ를 CBNZ로
변조하여 분기되는 기준을 뒤바꿔 버리는 식이였다.
하지만 주소값 변조는 다르다
현재 CBZ 분기문이 가리키고있는 주소는 loc_10009FE7C 이다
만약 저 분기문이 가리키고있는 주소값을 모든 프로세스를 무시하게끔 제일 끝부분인 loc_1000A0208 주소로 향하도록 변조한다면 우회가 되지 않을까? 라는 단순한 생각을 시도해봤다.
아래 그림처럼 많은 탐지 로직들을 다 건너뛰고 탐지 로직이 끝나는 주소로 향하는 것이다.
먼저 첫 분기문에서 가리키는 시작 주소는
loc_10009FE7C 이다
그리고 변조 목표로 하는 주소는 제일 끝단인
loc_1000A0208 이다
여기서 주소값은 loc_1000 이라는 공통적인 값을 가지고 봐야할 중요한 주소는 뒤의 5자리이다.
9FE7C 와 A0208
이 2개의 주소값에 대한 차이점은
HEX 값으론 38C 만큼 그것을 10진수로 변환하면 908 만큼 차이가 난다.
시작주소의 값에서 908만큼 더 해주면 목표하는 주소인 A0208로 변조가 가능하다는 뜻이다.
먼저 시작주소와 목표주소의 헥스값은 다음과 같다.
시작 loc_10009FE7C ( 54 03 00 34 28 93 43 F9 1F 05 00 B1 61 20 00 54 )
목표 loc_1000A0208 ( E0 03 14 AA FD 7B 47 A9 F4 4F 46 A9 F6 57 45 A9 )
위 헥스값에서 주소를 결정하는 부분은 빨간 3바이트 만큼이다. 파란 부분은 분기문을 결정하는 부분
시작 loc_10009FE7C ( 54 03 00 34 28 93 43 F9 1F 05 00 B1 61 20 00 54 )
목표 loc_1000A0208 ( E0 03 14 AA FD 7B 47 A9 F4 4F 46 A9 F6 57 45 A9 )
빨간 부분의 54 03 00 의 값을 변조해서 목표 주소로 향하게끔 해야하는데
이 16진수 값을 변조하여 주소가 변하는 규칙이 존재한다.
일단 16진수를 0부터 높은순으로 나열하면
0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 ... 식으로 간다.
자세한건 참조
그럼 위 16진수 54 03 00 의 각자리마다 5씩 증가한다고 하면
A9 58 55 가 되는 것이다.
그리고 주소값이 변하는 규칙은 아래와 같은데
5 4 0 3 0 0
■ W ◇ ◆ ★ ☆
위와 같이 16진수의 각 자리수를 도형으로 표기했을 때
5 4 0 3 0 0 = w20, 9 F E 7 C
☆ ★ ○ ● ◇ ◆ ★ ◇ ◆ ○ ● ☆
그에 대응되는 주소값의 자리가 존재한다.
첫째 자리인 5는 주소값의 끝인 C와 대응되며
4는 제일 앞의 W주소값
0은 E , 3은 7 이런식으로 각각 대응되는 자리가 있다.
헥사값이 1이 증가하면 주소값은 2가 증가한다.
예를들어
기존 주소값이 9FE7C 이고
변조 주소값을 BFE7C 로 9의 자리를 2를 증가시켜 B로 만들고 싶으면
54 03 00 에서 빨간 부분이 9의 자리에 대응이 되니
1을 증가시켜 54 03 10 으로 만들면 주소값은 2가 증가되어
0 1 2 3 4 5 6 7 8 9 A B C D E F 순으로 9 +1 = > A +1 = > B 가 되는 것이다.
같은 원리로 BFE7C 라는 주소값에서 BFE9C 로 만들고 싶다면
주소값의 7의 자리에 대응되는 헥스값을 1을 증가 시켜서 변조하면 BFE9C가 된다.
5 4 0 3 1 0 = w20, B F E 7 C
☆ ★ ○ ● ◇ ◆ ★ ◇ ◆ ○ ● ☆
5 4 0 4 1 0 = w20, B F E 9 C
☆ ★ ○ ● ◇ ◆ ★ ◇ ◆ ○ ● ☆
이런 원리로 이제 A0208로 향하도록 그 주소값을 변조해야하는데
아까 계산기로 주소값의 차이를 구한 것이 여기서 사용된다
16진수로 38C만큼 차이나고 그 38C를 10진수로 변환했을 때 908이 된다.
이 908차이를 구하려면
16진수 값이 가진 DEC값을 알아야한다.
다시 처음 주소값으로 돌아가서
5 4 0 3 0 0
☆ ★ ○ ● ◇ ◆
위 값에 대한 내가 발견한 10진수값은 다음과 같다.
5 4 0 3 0 0
2 W 512 32 ? 8192
W주소값은 아직 잘 모르고 3바이트의 첫번째자리도 모름
하지만 이정도만 알아도 주소값을 변조하는데 문제는 없다
908 차이를 구해야한다
일단 512값의 자리를 1를 올려줘서 512를 증가시킨다.
1024에서 32값을 12만큼 올려준다. 그럼 512 +384 = 896
896에서 2값을 6만큼 더해주면 896+12 = 908이 된다.
그럼 아래 16진수에 따라서
0 1 2 3 4 5 6 7 8 9 A B C D E F
54 에서 5자리가 6만큼 올라가서 6 7 8 9 A (B) B가 되고
03 에서 0자리가 1이 오르고 3자리가 12만큼 올라 4 5 6 7 8 9 A B C D E (F) F가 된다
추가적으로 변조팁이라면 3바이트 만큼이 주소값에 변화를 주지만
현재 예시에서 3바이트 부분인 00 은 따로 변조가 필요하지 않을 것 같다라는 느낌이 있다.
아직 한번도 건드려본적이 없음
54 03 00
B4 1F 00
그럼 처음에 목표했던 주소인 loc_1000A0208 로 분기문이 향하는 것을 볼 수 있다.
바이너리를 그래프로 크게보면 첫번째 분기문에서 향하는 주소가 변조되어 아래로 쭉 내려가 끝부분으로 향한다.
이런 방식으로 주소를 변조하여 우회가 되는 앱들이 있다.
분기문을 변조하더라도 우회가 되지 않는 앱들에 대해 한번씩 해볼만한 시도이긴 하나,
아직 연구가 덜 끝났다는 점, 그리고 어셈블리어의 구조나 개념에 대해서 잘 알지못해서
W나 X 주소값이 확실하지 않으면 우회가 불가한데, 이에 대한 개념이 없다는점,
여러가지 이유에서 아직 불확실한 부분이 많아 리턴이 확실하지가 않다.
하지만 분기문과 같이 주소를 변조하여 우회가 가능했던 앱이나,
분기문 변조로 우회가 되지않았던 앱이 주소 변조로 우회가 가능했던 경험도 있어
추후에 어셈블리나 기본적인 컴퓨터 지식들을 공부하고나서 다시 연구를 하게되면 새로운 것을 발견할 수 있을것 같다.
'모바일 > Ios' 카테고리의 다른 글
[iOS] 앱 복호화 Frida ios dump - Window 에러 현상 (0) | 2023.08.10 |
---|---|
[iOS] 트윅 호환성이 좋은 Checkra1n + Odyssey 탈옥 (Feat. Ventoy) (4) | 2022.10.21 |
[ios] 프리다 후킹 (Frida Hooking)을 통한 탈옥 탐지 우회 방법 2 (스크립트 활용) (0) | 2022.06.13 |
[ios] Frida Trace를 이용한 클래스 및 메소드 동작 추적 (3) | 2022.06.10 |