Ghidra 심볼을 x64dbg 로 export 하는 방법

실행 파일을 분석하는 방법은 크게 정적 분석과 동적 분석으로 나눌 수 있다.
정적 분석은 프로그램에서 제공하는 decompile 기능, 등을 이용하여 파일의 실행 가능한 코드의 가능성에 대해 분석하기 좋지만, 코드가 실행되는 시점의 레지스터, 메모리 상태를 알 수 없어 프로텍터, 암호화를 사용하는 파일에 대해 분석이 어려워진다.
반대로 동적 분석은 코드가 실행되는 시점의 데이터 상황을 알수 있지만, 현재 실행 흐름 밖에 보지 못해 다른 분기문을 실행했을 때 발생하는 경우를 알기 어렵다.
결론은 정적 분석과 동적 분석을 모두 병행하는 것이 바람직하다.
이 글에서는 Ghidra 를 이용하여 정적 분석하는 과정에서 분석가가 지정한 심볼 이름(label, rename)을 x64dbg 에 export 하여 동적 분석을 원활케하는 방법에 대해 설명한다.
Ghidra
아래 이미지는 IDR 을 이용하여 Delphi 함수 심볼이 복원된 Delphi PE 파일이다.
Ghidra Functions
창에서 복원된 Delphi 함수의 이름을 확인할 수 있다. 전체 함수를 선택한 후 CSV 파일로 Export 한다.
Ctrl + A
로 전체 함수를 선택.Export
-Export to CSV
선택.

Functions
탭의 데이터를 CSV 로 exportlst2x64dbg
lst2x64dbg 는 Ghidra 의 심볼 정보를 저장한 csv 파일을 입력으로 받아, x64dbg 에서 사용 가능한 db 파일을 생성하는 프로그램이다.
lst2x64dbg 패키지 내 주요 코드는 command_line.py
모듈 내에 존재한다. 해당 모듈은 다양한 디버거로부터 추출한 심볼 데이터를 추출하여 x64dbg 에서 import 할 수 있는 db 파일을 생성하는 함수들을 가진다. 이 중 ghidra2x64dbg()
함수는 ghidra 에서 추출한 함수 심볼 데이터를 가지는 csv 확장자 파일을 이용한다.
아래 스크립트는 lst2x64dbg.command_line
모듈 내 ghidra2x64dbg()
함수를 호출하는 run.py
스크립트이다.
# `run.py`
import lst2x64dbg.command_line as cl
if __name__ == "__main__":
cl.ghidra2x64dbg()
아래 이미지는 IDR 을 이용하여 Delphi 함수 심볼이 복원된 Delphi PE 파일이다.
run.py
에 적절한 인자를 주어 실행하여 x64dbg 에서 import 할 db 파일을 생성한다.이때 csv 파일의 이름은 실행 파일과 동일하거나, -m
인자에 실행 파일과 동일한 파일명을 전달해야 한다. 모듈 이름은 소문자이어야 한다.(ex. aa.exe)
-i
,--imagebase
: 실행 파일의 16진수 이미지 베이스. 필수 인자.-p
,--pretty
: database 를 JSON 포맷으로 출력.-6
,--x64bit
: 해당 파일이 64비트인 경우 사용.-d
,--dll
: 해당 파일이 DLL 인 경우 사용.-m
,--module
: 모듈 이름 지정.
> python run.py -i 400000 .\aa.csv
스크립트가 정상적으로 실행되면 dd32
또는 dd64
확장자 파일이 생성된다.

x64dbg
x64dbg 로 대상 실행 파일을 로딩한 후, 생성된 데이터베이스 파일을 import 하면 함수 이름이 라벨링되는 것을 확인할 수 있다.


Ctrl
+ Alt
+ L
을 누르면 Labels
탭에 export 된 심볼들이 출력되는 것을 확인할 수 있다. 참고로 함수 이름 중 .
은 _
로 치환된다. 예를 들어 ghidra 에서 함수명이 main.main
이면 x64dbg 에서는 main_main
라벨을 검색해야 한다.
