설치
lldb 설치
lldb 디버거를 먼저 설치해야한다.
https://developer.android.com/ndk/downloads?hl=ko
NDK 다운로드 | Android NDK | Android Developers
Google uses AI technology to translate content into your preferred language. AI translations can contain errors. NDK 다운로드 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 개발 플랫
developer.android.com
여기서 최신 버전 ndk를 설치할 수 있고, lldb가 존재한다.
wsl로 연결을 시도할 것이기 때문에 리눅스 대상 파일을 가져오고 압축을 풀어주자.
wget https://dl.google.com/android/repository/android-ndk-r27d-linux.zip
unzip android-ndk-r27d-linux.zip
그리고 ~/.bashrc에 경로를 추가해주자.
vi ~/.bashrc
export NDK_HOME=$HOME/android-ndk-r27d
export PATH=$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
source ~/.bashrc
lldb 서버 안드로이드에 옮기기
먼저 adb 파일을 설치해야한다.
wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
unzip platform-tools-latest-linux.zip
그리고 경로를 추가해준다.
vi ~/.bashrc
export PATH=$HOME/platform-tools:$PATH
export WSL_HOST=$(ip route show | grep default | awk '{print $3}')
export ADB_SERVER_SOCKET=tcp:$WSL_HOST:5037
source ~/.bashrc
이제 wsl에서 윈도우로 adb를 붙여야한다.
adb -a -P 5037 nodaemon server
위 명령어로 wsl에서 5037 포트에 접근할 수 있도록 열어준다. 안드로이드 스튜디오가 먼저 실행되어 있으면 5037 포트를 점유하고 있을 수 있으니 종료하고 위 명령어를 실행시켜주자.
그리고 adb devices를 사용하면 붙은 것을 확인할 수 있다.
이제 lldb-server를 업로드하면 된다.
find ~/android-ndk-r27d/ -type f -name lldb-server
위 명령어로 lldb 서버 파일을 찾는다.
/home/junwon/android-ndk-r27d/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/x86_64/lldb-server
/home/junwon/android-ndk-r27d/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/i386/lldb-server
/home/junwon/android-ndk-r27d/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/riscv64/lldb-server
/home/junwon/android-ndk-r27d/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/aarch64/lldb-server
/home/junwon/android-ndk-r27d/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/arm/lldb-server
위와 같은 경로에 lldb-server가 존재한다.
업로드 해주자.
adb push ./lldb-server /data/local/tmp
포트 및 방화벽 설정
adb forward
adb forward를 해주어야 한다.
adb forward tcp:5039 tcp:5039
만약 아래와 같은 에러가 발생한다면 포트 프록시의 설정과 충돌하여 발생하는 문제다. 지우고 다시 설정해주자.
# 에러 문구
adb.exe: error: cannot bind listener: cannot bind to 0.0.0.0:5039: 각 소켓 주소(프로토콜/네트워크 주소/포트)는 하나만 사용할 수 있습니다. (10048)
# 포트 프록시 설정 삭제
netsh interface portproxy delete v4tov4 listenport=5039 listenaddress=0.0.0.0
포트 프록시와 방화벽
lldb를 연결하기 위해 윈도우 호스트에서 프록시 설정과 방화벽 설정을 해주어야 한다. 관리자 권한의 powershell이 필요하다. 해당 권한을 얻기 힘들다면 다른 방법을 찾아보자. 여기서는 다루지 않는다.
# 현재 설정한 포트 프록시 설정
netsh interface portproxy show all
# 포트 프록시 설정
netsh interface portproxy add v4tov4 listenport=5039 listenaddress=0.0.0.0 connectport=5039 connectaddress=127.0.0.1
# 방화벽 규칙 설정
New-NetFirewallRule -DisplayName "WSL LLDB 5039" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 5039
디버깅할 앱의 프로세스를 가져와서 attach 시키자.
아래 명령어로 PID를 가져오자.
# 윈도우 호스트에서 실행
frida-ps -Uai
아래 명령어로 lldb-server를 실행시켜 주자.
# 안드로이드에서 실행
/data/local/tmp/lldb-server gdbserver --attach <PID> "*:5039"
# wsl 환경에서 실행
# IP 주소는 윈도우 호스트 IP(기본 게이트웨이 주소)
lldb
gdb-remote 172.31.128.1:5039
# 윈도우 호스트 주소(기본 게이트웨이 주소) 찾는 법
ip route show | grep default

짜잔
연결 성공!
'분류 전 > 개념 노트장' 카테고리의 다른 글
| Reverse Shell 실습 (2) | 2024.07.09 |
|---|---|
| Interval이 다를 때 OTP 코드가 다른 이유와 드림핵 SuperSecure OTP (0) | 2024.07.07 |
| [Flask] session 구조 (1) | 2024.04.11 |
| [SQL] information_schema가 필터링 됐을 때 Union SQL Injection (2) | 2024.03.29 |
| [Node.js] prepared statement 사용 시 주의 사항 (1) | 2024.03.28 |