IDA로 원격 디버깅하기

eunjo·2022년 8월 15일
0

저는 실행파일(특히 악성코드)을 분석할 때 주로 가상환경을 이용하곤 했는데요. IDA가 가상환경에 설치되어 있다 보니 이전 스냅샷으로 되돌아갈 때마다 IDB(IDA Database) 파일에 작성했던 심볼(함수명, 변수명, 주석 등)도 이전 형상으로 되돌아가는 바람에 서터레쓰를 받고 있었답니다. 디버깅 중에 스냅샷을 찍는 방법은 내키지 않았어요. 레지스터나 가상 메모리의 형상을 보존할 수 있다는 장점이 있지만, 가상환경이 실행 중인 상태에서 스냅샷을 찍을 경우 물리 메모리가 파일로 저장되어 호스트 PC의 디스크 공간을 많이 차지하기 때문이에요. 그렇다고 IDB 파일만 호스트로 내보냈다가 다시 가져오는 건 넘나뤼 귀찮은 일이구요... 그래서! 가상환경에 있던 IDA를 호스트 PC로 옮겼습니다. 이젠 가상환경을 이전 스냅샷으로 되돌리더라도 IDB 파일이 호스트에 있으므로 형상을 유지할 수 있게 됐어요.

2022년 4월에 OpenTRS(Open Theori Research Seminar)에서 조남준(a.k.a kirasys) 님이 QEMU 가상환경에서 원격 디버깅이 가능하도록 IDA 플러그인을 개발하여 발표한 세션이 있었는데요. IDA 원격 디버거의 동작과정 또한 다루고 있으니 참고하시면 되겠습니다.
*링크: Introduction to Permanent Debugging

0. 환경 구성

  • Host PC: IDA Pro 8.0, VMware Workstation 16.2.4
  • Guest PC: <ida_remote_debugger_server>, <target_binary>

제가 사용하는 환경은 위와 같습니다. 다른 버전에서는 테스트해보지 않았지만, 버전이 상이해도 원격 디버깅 환경을 구성하는데 큰 문제는 없어 보입니다.

1. 원격 디버거 서버 설치

File nameTarget systemDebugged programs
android_serverARM Android32-bit ELF files
android_server64AArch64 Android64-bit ELF files
android_x64_serverx86 Android 32-bit32-bit ELF files
android_x86_serverx86 Android 64-bit64-bit ELF files
armlinux_serverARM Linux32-bit ELF files
linux_serverLinux 32-bit32-bit ELF files
linux_server64Linux 64-bit64-bit ELF files
mac_serverMac OS X32-bit Mach-O files (x86)
mac_server64Mac OS X/macOS 1164-bit Mach-O files (x64)
mac_server_arm64ARM macOS 1164-bit Mach-O files (arm64)
mac_server_arm64eARM macOS 1164-bit Mach-O files (arm64e)
win32_remote.exeMS Windows 32-bit32-bit PE files
win64_remote64.exeMS Windows 64-bit64-bit PE files

%IDAPATH%\dbgsrv 폴더에는 다양한 CPU 아키텍처와 운영체제를 지원할 수 있도록 표와 같이 원격 디버거 서버 실행파일(백도어)이 존재합니다. 본인의 가상환경에 알맞게 선택하시고 원하시는 경로에 복사해주세요. 저는 Windows OS 가상환경에서 x86과 x64 실행파일 둘 다 디버깅이 가능하도록 win32_remote.exewin64_remote64.exe를 게스트 PC의 바탕화면에 복사했습니다.

원격 디버깅을 하시기 전에 호스트와 게스트 PC 간에 통신이 가능한지 확인해주시면 좋아요.

2. 원격 디버거 서버 실행

C:\Users\vm\desktop>win64_remote64.exe -h
IDA Windows 64-bit remote debug server(MT) v8.0.27. Hex-Rays (c) 2004-2022
Usage: win64_remote64.exe [options]
  -p ...  (--port-number ...) Port number
  -i ...  (--ip-address ...) IP address to bind to (default to any)
  -t      (--no-tls) Use plain, unencrypted TCP connections
  -c ...  (--certchain-file ...) TLS certificate chain file
  -k ...  (--privkey-file ...) TLS private key file
  -v      (--verbose) Verbose mode
  -P ...  (--password ...) Password
  -k      (--on-broken-connection-keep-session) Keep debugger session alive when connection breaks
  -K      (--on-stop-kill-process) Kill debuggee when closing session

디버거 서버 실행파일이 지원하는 옵션 목록입니다.

C:\Users\vm\Desktop>win64_remote64.exe
IDA Windows 64-bit remote debug server(MT) v8.0.27. Hex-Rays (c) 2004-2022
2022-08-16 02:33:23 Listening on 0.0.0.0:23946 (my ip 192.168.49.129)...

옵션을 입력하지 않고 실행할 경우, 기본 포트 23946을 열고 대기합니다.

C:\Users\vm\Desktop>win64_remote64.exe -p 1234
IDA Windows 64-bit remote debug server(MT) v8.0.27. Hex-Rays (c) 2004-2022
2022-08-16 02:34:52 Listening on 0.0.0.0:1234 (my ip 192.168.49.129)...

-p 옵션을 줘서 원하는 포트 번호를 사용할 수도 있습니다.


디버기 프로세스는 원격 디버거 서버의 자식 프로세스로 생성됩니다. 따라서 부모 프로세스의 권한을 상속받게 되므로, 분석 대상 실행파일을 관리자 계정 권한으로 실행하고 싶다면 서버를 관리자 계정 권한으로 실행하시면 됩니다.

3. 원격 디버거 클라이언트 연결

우선, 호스트 PC에서 IDA에 분석 대상 실행파일을 올려 IDB 파일을 생성해주세요. 그리고 생성한 IDB 파일을 실행해주세요.


IDA 화면 상단에 보시면 디버거의 종류를 선택할 수 있는 드롭다운 메뉴가 있습니다. Remote Windows debugger 선택해주시면 됩니다.

  • Application: 실행할 프로그램 경로. 원격 서버 환경의 경로를 입력해야 함.
  • Input file: 분석 대상 실행파일 경로. 원격 서버 환경의 경로를 입력해야 함.
  • Directory: 시작 디렉토리. 원격 서버 환경의 경로를 입력해야 함.
  • Parameters: 프로세스 실행 인자.
  • Hostname: 원격 디버거 서버의 IP 주소 또는 도메인 주소.
  • Password: 원격 디버거 서버 연결 비밀번호. 서버를 -P 옵션과 함께 실행한 경우에 유효함. 사용자 계정 비밀번호와 무관.
  • Port: 원격 디버거 서버가 listening하고 있는 포트 번호.

Debugger > Process options를 누르시면 위의 그림과 같은 설정 화면이 보입니다. 헷갈리실 수 있는 부분이 ApplicationInput file의 차이인데요. Application은 원격 디버거 서버가 실행할 파일을 말하고, Input file은 IDB를 생성하는데 사용된 분석 대상 파일을 말합니다. 분석 대상 파일이 단독으로 실행 가능한 경우엔 둘은 동일하지만, 단독으로 실행이 불가하여 Loader가 필요한 경우엔 Application에 Loader의 경로가 위치합니다. 예를 들어 DLL을 디버깅하고 싶다면 Application에 Rundll32.exe와 같은 유틸리티의 경로를 입력하고, Input file엔 DLL의 경로를 입력해야 합니다.

여기까지 마치셨다면 나머지는 일반적인 디버깅과 동일하게 진행하시면 됩니다.

그럼 즐거운 분석 되세요!!

A. 참고 자료

profile
바이너리 분석이 좋아요

0개의 댓글