새소식

모의해킹/iOS

Binary Patch with (IDA, radare2)

  • -
반응형

무결성 탐지 여부 체크나 기타 보안 로직 등을 정적으로 우회해야 할 때
바이너리를 직접 변조하는 경우가 있다.
IDA 및 radare2 등의 도구들을 통해 바이너리의 내부 로직을 변조하는 법을 알아보자.

테스트는 DVIA의 테스트용 앱을 이용해 진행하였으며
바이너리 패치를 통해 Jailbreak Test 1 항목을 변조하는 것을 목표로 했다.

Device is Jailbroken

1. IDA 를 이용한 바이너리 변조

( radare2 내용만 보고 싶다면 '2. radare2를 이용한 바이너리 변조' 로 바로 이동 🐣)

우선 ipa 파일을 압축 해제 후, 바이너리 파일을 IDA에 로드하여
strings (Shift + F12) 기능을 통해 팝업 메시지의 문자열을 검색했다.

위 문자열을 더블 클릭하여 이동하고,
Ctrl+x 를 누르면 해당 문자열이 참조되는 위치를 추적할 수 있다.

문자열이 호출되는 곳으로 추적해서 올라가보면 TBZ 명령어를 통해 분기가 이뤄지고 있으며,
이를 TBNZ로 바꿔주기만 하면 로직이 반대로 동작한다.
해당 구문을 변조하기 위해 TBZ 명령어 부분을 선택하고 Hex View 탭을 연다.

Hex View에서 Edit 모드로 전환(F2) 하여 명령어에 해당하는 Hex값을 수정하고
다시 Apply changes(F2)를 눌러 수정을 완료하면 된다.
Hex값은 armconverter 를 참조했다.

ARM Converter

수정 된 내용을 실제 바이너리 파일에 적용하게 위해
Edit > patch program > Apply patches to input file 에서 패치를 진행한다.

다시 ipa 파일로 묶는 법은 기존 바이너리가 포함되어 있는 Payload 폴더를 .zip 으로 압축하고
.ipa 로 확장자를 변경하면 된다.

생성한 ipa를 다시 단말기에 설치하면 로직이 변조되어 'Device is Not Jailbroken' 메시지를 확인 가능하다.

Device is Not Jailbroken


 

2. radare2를 이용한 바이너리 변조

마찬가지로 우선 ipa 파일의 압축을 해제하고, radare2를 이용해 바이너리 파일을 쓰기 모드로 연다.

izzq 로 메시지 발생하는 문자열의 주소값을 확인하고,
axt 를 통해 해당 문자열을 참조하는 위치(xref)를 찾아 이동한다.

VV 로 Visual Mode 로 전환 후 tbz 명령어를 통해 조건분기되고 있음을 확인하고,
Shift+Tab을 눌러 상위 노드를 선택했다.
(아래 사진을 자세히 보면 선택된 노드는 점선으로 된 테두리가 노란색으로 보인다)

q 를 두번 눌러 Visual Mode를 다시 빠져나온 후
pd 명령어를 통해 해당 tbz 구문의 주소값과 명령어(hex값)을 확인한다.

radare2에서는 패키지에 함께 포함된 rasm2 을 통해 명령어 인/디코딩이 가능하기 때문에
armconverter가 필요없다.
rasm2 을 통해 tbz 구문에 해당하는 hex값을 디코딩하여 구문의 형태를 확인하고,
반대로 동작하도록 opcode만 바꿔서 wa로 해당 위치에 덮어 씌워주면 된다.

패치 되어서 rasm2 조차 필요없게 되었다. 

> wa tbnz w0, 0, 0x1001cc17c 

별도의 변환 과정 없이 위 명령어로 패치하면 된다.

패치한 바이너리를 포함하여 Payload 폴더 압축 후 .ipa 로 확장자를 바꿔 단말기에 설치하면
패치가 정상적으로 이뤄진 것을 확인할 수 있다.




Reference

https://fir3.tistory.com/22
http://blog.no-named.kr/how-2-use-radare2/

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.