Ghidra 심볼을 x64dbg 로 export 하는 방법

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 선택.

Ghidra Functions 탭의 데이터를 CSV 로 export

lst2x64dbg

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 확장자 파일이 생성된다.

lst2x64dbg 에 의해 생성된 dd32 파일

x64dbg

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

Import database 기능으로 DB 적용
dd 파일 import 전(왼쪽), 후(오른쪽) 코드

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

export 된 symbol 정보