Capston. Python-bindiff 사용

하스코딩·2025년 3월 30일
post-thumbnail

python-bindiff readme 요약

1.작동원리

a. 두 바이너리 → 두 .BinExport : py-bindiff 내에서 py-binexport 라이브러리와 IDA-Pro를 사용.(우리는 기드라를 씁니다)
b. 두 .BinExport diffing : py-bindiff 내에서 bindiff.exe 실행파일을 직접 호출하여 작업.
c. diff 파일 생성 : 두 바이너리와 연관되어 각 프로그램 객체에 내장됨

2.GUI를 활용한 디핑

a. 바이너리 → .binexport : Ghidra(ver : 11.0.3) + binexport(ver : 12)
b. .binexport → .BinDiff : Bindiff(ver : 8)
c. .Bindiff → 가시화 : Bindiff(ver : 8)

3.CLI를 활용한 디핑

a. 바이너리 → .binexport : python-Ghidra(ver : ?) + binexport(ver : ?)
b. .binexport → .BinDiff : python-bindiff(ver : ?)
c. .Bindiff → 가시화 : Bindiff(ver : ?)

사용할 프로그램들 버전 정보

IDE: PyCharm Community Edition 2024
python: python 3.12.9(반드시 3.9 버전 이상을 사용해야 함)
Ghidra: 11.3.1
bindiff: 8.msi
BinExport: 12(Updated for Ghidra 11.0.3)

1. python-bindiff 설치

  1. "D:\BinDiffTest" 경로에 binexport 폴더를 생성한다.
  2. cmd를 관리자 권한으로 실행, 해당 폴더로 이동해 아래 명령어로 python-bindiff를 install해준다.
    "pip install python-bindiff"

2. BinExport 파일 준비

  • 명확한 변화를 보이는 .cpp 코드를 다시 작성해서 디핑해보자.

1. 두 버전의.c파일을 .exe파일로 만들기

  1. 두 cpp파일을 작성한 뒤 Release 모드로 ctrl + shift + B로 빌드해 아래 경로에서 .exe 파일을 복사해 따로 저장해둔다.
    경로: "D:\vsProjects\CPP\x64\Release"
  • func_v1.cpp
#include <stdio.h>

void func() {
    printf("simple\n");
}
int main() {
    func();
    return 0;
}
  • func_v2.cpp
#include <stdio.h>

void func() {
    int sum = 0;
    for (int i = 1; i <= 100; i++) {
        sum += i;
    }
    if (sum > 1000) {
        printf("Large sum: %d\n", sum);
    }
    else {
        printf("Small sum: %d   \n", sum);
    }
}

int main() {
    func();
    return 0;
}
  • 아래와 같이 기존의 hello_v1.exe 파일을 보관하던 Bindiff 폴더에 저장해 줬다.

2. Ghidra로 .BinExport 파일 생성하기

  1. 관리자 권한으로 Ghidra를 실행해 .exe 파일을 import해줬다.
  2. 각 파일을 클릭해서 export program을 클릭해 두개의 .BinExport파일을 생성해줬다.

3. BinDiff CLI로 .BinDiff파일 생성

  1. 이제 cmd를 관리자 권한으로 실행해 BinDiff CLI로 두 .BinExport 파일을 diff해 .BinDiff 파일을 생성해줬다.
"C:\Program Files\BinDiff\bin\bindiff.exe" "D:\BinDiffTest\func_v1.BinExport" "D:\BinDiffTest\func_v2.BinExport" --output_dir "D:\BinDiffTest"
  • 그럼 아래와 같이 diff를 해준 결과 파일을 생성해준다. 유사도는 97.9%로 분석되었음을 확인할 수 있다.

4. python-bindiff로 결과를 파싱

  1. pycharm을 관리자 권한으로 실행해주고, pycharm에 python버전이 3.9 이상인지 확인한다.
  2. 아래 코드를 작성하고 나서 실행해보면, 변경된 함수 목록이 출력되어야 한다.
from bindiff import BinDiff

# 경로 설정
primary = "D:/BinDiffTest/func_v1.BinExport"
secondary = "D:/BinDiffTest/func_v2.BinExport"
diff_file = "D:/BinDiffTest/func_v1_vs_func_v2.BinDiff"

# BinDiff 로딩
diff = BinDiff(primary, secondary, diff_file)

# 변경된 함수만 출력
print("🔍 변경된 함수 (similarity < 1.00):")
for primary_func, secondary_func, match in diff.iter_function_matches():
    if match.similarity < 1.0:
        print(f"⚠️ {primary_func.name} ↔ {secondary_func.name} → similarity: {match.similarity:.2f}")
  1. 출력 결과
  • 아래와 같이 140001070 주소에서 유사도가 0.22로 매우 낮은 것을 발견했다.

5. BinDiff GUI로 Diff해 결과 확인

  1. 이번에는 BinDiff를 관리자 권한으로 실행해 직접 두 .BinExport 파일을 diff 해줬다.
  2. 그리고 140001070 주소에 접근해보니 정말 유사도가 0.22로 나와있었다.
  3. 이는 python-bindiff 모듈을 사용해 BinDiff CLI로 생성한 .BinDiff 파일을 분석한 결과가 정확함을 의미한다.
  4. 이제 유사도가 0.22인 주소에 접근해 확인해보니 아래와 같이 큰 차이를 볼 수 있었다.

0개의 댓글