본문으로 바로가기

가. 애플리케이션 패칭이란?

- 애플리케이션 패칭(Application Patching)은 애플리케이션의 바이너리 파일이 영구적으로 변경되는 것을 말하며 애플리케이션 위·변조라고도 부른다.

- 바이너리 파일에는 앱 실행 및 동작에 필요한 모든 데이터들이 들어가 있으므로 바이너리 파일을 수정하여 로그인 메소드, 탈옥 탐지 메소드 등을 우회할 수 있다.

* 바이너리(Binary) 파일이란 실행 가능한 형식의 데이터 파일을 말하며, 쉽게 윈도우즈의 exe 파일이라 생각하면 된다.

 

나. 대응방안

- 애플리케이션 바이너리 파일의 해시 값을 검증(코드 무결성 검증)하여 앱이 위·변조되었는지 체크한다.

https://www.kisa.or.kr/2060204/form?postSeq=3&lang_type=KO#fnPostAttachDownload

 

다. DVIA-v2 앱을 통한 실습

1. 분석 대상 앱 실행

- 어플리케이션 패칭 실습을 위해 DVIA-v2 앱을 실행한다.

 

※ DVIA-v2 어플이 설치되어있지 않은 사람은 아래의 글을 참고하여 앱을 설치하길 바란다.

2022.07.01 - [Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 04강 - 진단 대상 설치

 

[iOS App 진단] 04강 - 진단 대상 설치

iOS 앱 진단을 위해 설치 파일을 요청하면, 대개 아래 3가지 방법 중에 하나의 방법으로 전달해준다. 1. 앱 스토어를 통해 설치 이미 앱 개발이 완료되어 앱스토어에 등록되어 있을 경우, 앱스토어

hagsig.tistory.com

 

- 메인메뉴 좌측 상단 메뉴 클릭 Application Patching 클릭 START CHALLENGE 클릭 → Kill Application 클릭.

- 앱이 강제종료되는 것을 확인할 수 있다.

- 본글에서는 앱이 강제종료되지 않고 계속 이용할 수 있도록 바이너리 파일을 변조할 것이다(강제종료 우회).

 

2. ASLR 적용여부 확인

- ASLR이 적용되어 있지 않은 앱은 어플리케이션 패칭이 어려우므로 적용유무를 꼭 확인하여야 한다.

* ASLR(Address Space Layout Randomization, 주소 공간 배열 무작위화) : 메모리 손상 취약점 공격을 방지하기 위한 기술로, 프로그램이 실행될 때마다 메모리주소가 랜덤으로 변경된다.

- 아래의 글을 참고하여 앱에 ASLR이 적용되어 있는지 확인한다.

2023.10.03 - [Mobile App 취약점 진단/iOS App 진단] - 바이너리 ASLR 적용유무 확인방법 - otool

 

바이너리 ASLR 적용유무 확인방법 - otool

가. ASLR(Address Space Layout Randomization) 이란? - "주소 공간 배열 무작위화"로 직역되며 메모리 손상 취약점 공격을 방지하기 위한 기술이다. - 프로그램이 실행될 때마다 메모리주소가 랜덤으로 변경

hagsig.tistory.com

 

3. 바이너리 파일 추출

- 바이너리 파일을 변조하기 위해서는 앱내부에 존재하는 바이너리 파일을 추출해내야 한다.

- 3uTools Files에서 Applications(User) 클릭 또는 탐색창에 /var/Containers/Bundle/Application 입력한다.

- 분석 대상 앱 이름과 동일한 폴더를 더블클릭한다.

 

- Size 클릭하여 파일을 크기순으로 정렬한다.

- 폴더를 제외하고 크기가 제일 큰 파일이 바이너리 파일이다.

 

-  바이너리 파일을 우클릭한 뒤 Export 버튼을 눌러 PC로 추출한다.

 

4. 바이너리 파일 분석

- 아래의 과정을 따라하여 추출한 바이너리 파일을 기드라(Ghidra)를 통해 분석한다.

 

※ 기드라가 설치되어 있지 않은 사람은 아래의 글을 참고하여 설치하길 바란다.

2022.06.28 - [Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 03강 - 진단 도구 설치

 

[iOS App 진단] 03강 - 진단 도구 설치

1. Cydia(시디아) - 탈옥을 성공하면 자동으로 설치되며, 앱 스토어에서 지원하지 않는 앱을 다운로드할 수 있다. - iOS가 지원하지 못하는 기능을 Cydia를 이용하여 설치할 수 있는데 이를 Tweak(트윅)

hagsig.tistory.com

 

- File 클릭 → New Project 클릭 → Non-Shared Project 선택 → Next 클릭

 

- Project Directory 경로지정 → Project Name 입력 → Finish 클릭 → File 클릭 → Import File 클릭

* Project Directory : 프로젝트 저장 경로.

* Project Name : 프로젝트 이름.

 

- 위에서 추출한 바이너리 파일 선택 → Select File To Import 버튼 클릭

 

- 설정내용을 아무것도 건드리지 않고 OK 버튼 클릭

 

- 추가된 바이너리 파일(DVIA-v2)을 더블클릭 → Yes 버튼 클릭

 

- 설정내용을 아무것도 건드리지 않고 Analyze 버튼 클릭 → 분석이 종료될 때까지 대기(우측 하단에 진행률이 표시됨).

※ 분석이 종료되면 알림창이 발생한다. 분석이 완료되지 않으면 결과가 달라질 수 있으므로 완료될 때까지 기다린다.

 

- Search 클릭 → For Strings 클릭

 

- Kill Application과 관련된 문구가 있는지 검색.

- 하나씩 들어가 확인해 보았지만 애플리케이션 종료와 관련된 부분이 보이지 않음.

 

- 클래스에서 사용하는 함수들 중에 Kill Application과 관련된 것이 있는지 검색.

- 검색된 내용을 하나씩 확인하던 중 "__T07DVIA_v240ApplicationPatchingDetailsViewControllerC04killC6TappedyypF"함수가 강제종료 로직으로 의심이 되는 부분이 발견됨.

- "__stubs::_exit"을 더블클릭한다.

 

- 더블클릭하면 "__stubs::_exit"의 처리 로직이 출력된다.

- 내용을 보내 앱을 종료시키는 곳이 맞는 것 같다.

 

5. 바이너리 파일 변조

- "__stubs::_exit" 로직이 실행되지 않도록 변조를 시도한다.

- "__stubs::_exit"가 있는 행을 우클릭 → Patch Instruction 클릭

 

- "__stubs::_exit"을 nop으로 변경한 뒤 엔터를 누른다.

* 기존(AS-IS) : bl 0x100329f4c

* 변경(TO-BE) : nop

 

- 이렇게 변조된 바이너리를 추출하여 실행하면 기존과 동일하게 앱이 강제종료된다(실패!).

- 1001ac6b4를 nop으로 변조하면서, 해당 주소 밑에 있는 부분이 실행되면서 앱을 강제종료 시키는 것 같다.

- 아래의 박스 친 부분을 모두 nop으로 변경한다.

※ 1001ac718 ret까지 nop으로 변경하면 안된다.

 

- File 클릭 → Export Program 클릭

 

- 저장된 바이너리파일의 확장자를 삭제 → 3uTools를 통해 앱의 바이너리 파일 교체(덮어쓰기)

* 기존(AS-IS) : DVIA-v2.bin

* 변경(TO-BE) : DVIA-v2

 

-앱을 재실행 한 뒤 다시 Kill Application 버튼을 눌러보면 앱이 종료되지 않음을 확인할 수 있다.