Application Patching

justugi·2024년 7월 10일
0

DVIA

목록 보기
10/11

주의사항 : 이 포스팅은 개인 학습 및 교육적 목적으로 작성되었으며, 제공하는 정보를 악용하여 불법적인 행위를 하는 것은 엄격히 금지되어 있습니다. 타인의 시스템에 대한 접근 권한을 얻기 위해 명시적인 동의를 받아야 하며, 이러한 기술을 사용하여 발생하는 모든 결과에 대한 책임은 사용자에게 있습니다.

Application Patching

: 애플리케이션 패칭 취약점은 앱의 바이너리 파일을 변조하여 영구적으로 변경된 로직을 사용할 수 있는 취약점으로, 애플리케이션 위·변조라고도 부른다.

  • 애플리케이션 패칭이 가능한 경우 로그인 메소드, 탈옥 탐지 메소드 및 앱에서 사용되는 특정 명령어 패치가 가능하여 각종 개인정보 유출, DDoS 공격 등의 악의적인 행위가 가능하다.

앱의 바이너리 파일을 추출 - 패칭 - 서명값 변조 - 덮어쓰기 과정을 거치는 것이 일반적이지만, DVIA 의 IPA 파일을 ZIP 으로 변환하여 Payload 에 위치한 바이너리 파일을 패칭 후 앱을 재설치하는 과정을 통해 결과를 살펴보겠다.


Login Method 1

: 사용자가 입력한 계정 정보와 상관없이 항상 로그인이 가능하도록 패칭

  1. 로그인 시도

  • 실패 메세지 : Incorrect Username or Password
  1. Ghidra 실행

  • 실패 메세지 검색 - 첫번째 링크 - 그래프 - 분기 확인

  1. 패칭

  • 분기점 선택 - Patch Instruction - 성공했을 때의 주소로 변경
  1. 로그인 시도

  • 로그인 우회 성공

Check For Jailbreak

: 항상 탈옥 탐지 우회가 되어 있는 상태로 바이너리를 패칭

  1. 탈옥 확인

  • 현재 내 탈옥된 아이폰의 DIVA 에서는 탈옥이 탐지되지 않는다. → 탈옥이 탐지되도록 변경하겠다.
  1. Ghidra 실행

  • 실패 메세지 검색 - 링크 - 그래프 - 분기 확인
  • w0 레지스터 값이 0x0인 경우 1001cc17c 로 분기를 한다. 현재 값이 0 이기 때문에 탈옥이 되지 않는 분기로 넘어가고 있다.
  1. 코드 작성 후 프리다 실행
// CheckForJailbreak.js

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))
	}
})

  • w0 값이 0x0 이므로 탈옥이 되지 않았다고 뜨니까 분기문 조건의 w0 값을 0x1 로 변경하면 탈옥이 되었다고 뜰 것이다.
  1. 패칭

  • 분기의 w0 값을 0x1 로 변경한다.
  1. 탈옥 탐지

  • 아직 탐지 되지 않는다고 뜬다.

  • ※ 의도대로 동작하지 않은 원인 : tbz 명령어의 두번째 변수가 숫자 or boolean 값을 저장하는 것이 아니라 비트를 지정하는 변수였다.

tbz Rn, #imm, label
Rn : 테스트할 레지스터
imm : 테스트할 비트의 위치
label : 분기할 목적지

  1. 패칭 재시도

  • 원래 검사하던 비트로 수정하고, tbz (Test Bit and Branch if Zero) 와 반대 동작을 수행하는 tbnz (Test Bit and Branch if Non-Zero) 명령어로 수정하였다.
  1. 탈옥 탐지

  • 탈옥 탐지되었다고 뜬다.

Show Alert

: 경고 문구가 임의의 내용으로 출력되도록 패칭

조작

  1. Show Alert

  1. 메세지 조작

  • Hxd Editor - DVIA 바이너리 파일 열기 - I love Google 검색 - Google 을 Apple 로 변경 - Google 의 마지막 글자인 e 의 바이너리값 65 를 00 으로 수정
  1. Patched Show Alert


Kill Application

: 앱 종료 버튼을 눌러도 앱이 종료되지 않도록 패칭

  1. Kill Application
  • Kill Application 터치 시 앱이 종료된다.
  1. Ghidra 실행

  • Smbol Tree - kill 검색 - exit 더블 클릭

  • 마지막 링크 더블 클릭

  • 마지막 ret 는 남겨두고 (1001ac698 ~ 1001ac714) 해당 기능을 하는 부분을 모두 nop 으로 수정하면 아무런 동작을 하지 않게 된다.
  • bl (Branch with Link) : 지정된 곳으로 분기 시키는 명령어
  • ret (Return) : 현재 함수나 서브루틴의 실행을 종료하고, 호출한 지점으로 돌아간다.
  • nop (No Operation)
  1. Patched Kill Application

  • Kill Application 를 터치해도 앱이 종료되지 않는다.

대응 방안

  • 위변조 탐지 : 애플리케이션 바이너리 해시 값을 검증한다. (코드 무결성 검증)

출처
https://takudaddy.tistory.com/611
https://www.inflearn.com/questions/130882
https://ch4njun.tistory.com/165

profile
IT 보안, 관심 있는 것을 공부합니다.

0개의 댓글

관련 채용 정보