lldb-10 을 이용한 IOS Application 동적디버깅

홈 > IOS > IOS > 기술
IOS

lldb-10 을 이용한 IOS Application 동적디버깅

3 ch4njun 12 10865 4
lldb를 사용해 IOS의 Application 동적 디버깅을 진행하는 방법에는 두가지가 있다.

1) macOS의 xcode를 사용해 원격으로 디버깅을 진행하는 방법
2) lldb-10 tweak을 설치해 로컬에서 진행하는 방법
   (별다른 Source를 추가하지 않고 그냥 검색을 하면 나온다.)

나는 후자를 선택해서 진행했으며 로컬연결은 OpenSSH를 설치해 터미널상에서 진행했다.


IOS Version : IOS 12.4.8
IOS Device : IPhone 6
Jailbreak : Yes (unc0ver)



lldb-10 을 사용해 Process를 Attach하는 방법

1. ps -ef 를 사용해 Attach하고 싶은 Proccess의 PID를 찾는다. (당연히 App을 실행한 이후에)

img.png


2. lldb-10 명령어를 사용해서 해당 PID를 사용해 대상 Process에 Attach한다.

img.png


3. continue(c) 명령어를 사용해 Stop되어있는 Process를 resume한다.

img.png




공유라이브러리의 API에 BreakPoint 설정하는 방법

-[NSFileManager fileExistsAtPath:] 와 같은 API에 BreakPoint를 설정하고 싶을 때 사용한다. 주의해야 할 것은 사용자함수에 대해서는 안된다. 이 경우는 밑에서 추가적인 방법을 소개하도록 한다.


"b -[NSFileManager fileExistsAtPath]" 명령어를 사용해 BreakPoint를 설정한다.

img.png



사용자 함수에 BreakPoint 설정하는 방법

사용자 함수는 공유라이브러리(dylib)의 API처럼 모든 Process에 존재하는 것이 아니기 때문에 lldb에서 함수 이름(Symbol)을 알고있지 않다. ___lldb_unnamed_symbol587$$[APPNAME] 와 같은 형태로 알고있긴 하지만 우리가 가진 정보로 이 존재를 알아내기란 쉽지 않다. (루틴을 일일이 따라가보며 찾아낼 순 있겠지만ㅎㅎ)


1. image list 명령어로 Process에 올라온 Library를 확인하고, Binary의 BaseAddress를 찾는다.

img.png

Binary에 대한 정보는 보통 가장 위에 있으며 여기서는 BaseAddress는 0x000000010058c000이다.



2. IDA에 Binary File을 올려 대상 함수의 Offset을 찾는다.

img.png

간단하게 찾을 수 있으며, Offset은 BaseAddress를 뺀 0x19A0C 인 것을 확인할 수 있다.

Binary File을 뽑아내는 방법은 앞 포스팅을 참고하자.



3. BaseAddress와 Offset을 더해서 대상 함수의 Address를 구한다.

img.png


4. "b [Address]" 명령어를 사용해 해당 함수에 BreakPoint를 설정한다.

img.png

제대로 BreakPoint가 걸린 것을 확인할 수 있다. 보다시피 함수명이 ___lldb_unnamed_symbol580$$[APPNAME] 으로 되어있는 것을 확인할 수 있다. 물론 이걸 직접 "b ___lldb_unnamed_symbol580$$[APPNAME]" 해도 BreakPoint는 걸린다. 그러나 우리가 이걸 알아내는 것이 매우 어려울 수 있다.





Tip !!!

(IOS Application Dynamic Debugging을 진행하면서 유용했던 것들에 대한 정리)


1. 해당 API호출시 BreakPoint에서 Process가 Stop하는데 이 때 Argument정보 확인하기.

img.png

BreakPoint로 설정된 API 호출시 위와같이 Process가 Stop한다. 이 때 "po $arg1" 명령어를 사용해 이 API가 호출될 때 전달된 Argument를 확인할 수 있다.


물론 ARM 함수 호출규약에 의해서 $x0, $x1, $x2 ... Register를 통해서도 확인이 가능하다.

그리고 당연하게도 "register write x2 [Input]" 명령어로 이 값의 변경도 가능하다.




2. Process의 Register 정보를 확인하고 변조하기. (반환값 변조라던가.. 뭐 그럴때)

img.png

우선 "ni" 명령어를 계속 사용해 해당 함수를 빠져나가는 ret까지 이동했다.

(next instruction 명령어로 gdb와 같은 명령어이므로 설명은 생략한다.)


"register read" 명령어를 사용해 모든 Register에 대한 정보를 확인할 수 있다. 그리고 반환 값이 저장되는 Register $x0을 보니 0x01이 저장된 것을 확인할 수 있다. 이 값을 이제 0x00으로 변경해보도록 하자.


img.png

"register write [target] [value]" 명령어를 사용해 해당 Register의 값을 0x00으로 수정한다. 그리고 다시 Register를 확인해보니 정상적으로 값이 변경된 것을 확인할 수 있다.

(깨알같이 특정 Register의 정보만 확인하는 방법에 대해서 소개해봤다 ㅎㅎㅎ)




3. 특정 함수로 BreakPoint를 걸고 Stop됐을 때 반환 값만 바꿔서 바로 종료하기.

   (굉장히 유용할 것으로 예상된다.. 감히? - 사실 이 동작은 FRIDA로 더 간단하게 가능하긴 하다.)

img.png

BreakPoint에 의해서 ___lldb_unnamed_symbol580$$DamnVulnerableIOSApp 의 시작부분에서 Process가 Stop된 것을 확인할 수 있다. 이 때 "thread return 0x00" 명령어를 사용해 해당 함수의 반환 값을 0x00으로 주고 바로 함수를 종료시킬 수 있다.


신경써줘야할 부분은 "continue" 명령어를 사용해 resume을 해줘야 한다는 점이다. 함수를 빠져나가기만 하지 바로 이어서 실행되는게 아니다.




이외에도 굉장히 다양한 명령어와 편리한 기능들이 존재한다. 사용하게되면 계속해서 추가하도록 한다. 자세한 명령어들을 알고싶으면 LLDB 홈페이지를 참고하도록 하자.

- GDB, LLDB의 명령어 비교
https://lldb.llvm.org/use/map.html

- LLDB의 튜토리얼
https://lldb.llvm.org/use/tutorial.html
 


12 Comments
3 ch4njun 2020.08.07 16:28  
처음 접하며 공부했던 내용인데 공유해봅니다.
https://ch4njun.tistory.com 에 공부하며 개인적으로 정리한 자료들 있으니 같이 공유하며 공부하면 좋을 것 같습니다.
4 쿨록 2020.08.09 17:07  
감사합니다 정독할게요
3 빡빡이2 2020.08.09 21:11  
감사합니다. 블로그에 좋은 강의가 많네요!
9 선우아빠 2020.08.11 10:07  
크악 아직 해보지는 못했지만 정성~꼭 해보겠습니다
1 업복이 2020.08.14 23:03  
정성이 대단하시네요
1 homoso 2020.08.14 23:16  
대단하십니다!
1 린엔진유저1 2020.08.28 19:41  
감사합니다~^^
2 뽀글머리 2020.08.28 22:12  
아주 좋은 정보네요.. 감사히 읽고 갑니다
1 동동키 2020.09.19 14:12  
대단한정보네요 감사합니다
2 nz3ro 2021.01.23 17:55  
감사합니다
1 드봉 2021.09.21 14:37  
좀 어렵네요
4 파이리 2021.11.23 15:28  
혹시 탈옥툴을 타기도 하나요 ??

저는 두개 탈옥된 아이폰으로 해봤는데
attach 하려는 APP 실행하고 ps -ef | grep ios로 따왔는데
ttys000에 대한 PID는 나오는데 실행한 APP에 대한 것은 안나오더라구요
조언을 구할 수 있을까요?? 제가 가지고 있는 탈옥폰 정보는 아래에 있습니다. ㅠㅠ
계속 실패하니까 더 해보고싶은데 길이 안보입니다 ..하

IOS Version : IOS 12.5.2
IOS Device : IPhone 6
Jailbreak : checkra1n

IOS Version : IOS 14.3
IOS Device : IPhone SE
Jailbreak : TAURINE
Category