hhkb.dev

BLOG

2025-10-23 / 어셈블리 · 09

Ghidra를 활용한 디컴파일(Decompilation) 분석

IDA Pro는 강력하지만 개인 학습용으로 쓰기에는 비용 장벽이 크다. 그래서 개인이나 입문 단계에서는 Ghidra를 많이 쓴다. NSA가 공개한 오픈소스 도구인데, 무료치고 기능이 꽤 강력하다.

1. 정적 분석과 디컴파일러

어셈블리 코드는 기계어와 가까워서 동작을 정확히 읽기 좋다. 대신 가독성은 매우 떨어진다. 수만 줄을 눈으로만 따라가면 금방 한계가 온다.

디컴파일러는 이 기계어를 분석해서 C와 비슷한 의사 코드로 복원해준다. 원본 소스는 아니지만, 전체 로직을 파악하는 데는 훨씬 효율적이다.

  • MOV EAX, [RBP-0x4] -> user_input = local_var
  • CMP EAX, 10 / JNE -> if (user_input == 10) { ... }

물론 원본과 100% 같지는 않다. 변수명은 사라지고, 구조도 일부 달라질 수 있다. 그래도 큰 흐름을 잡기에는 훨씬 빠르다.

2. Ghidra 설치

Ghidra는 Java 기반이라 JDK 11 이상이 필요하다. 보통은 OpenJDK 17 정도면 무난하다. 공식 사이트에서 받아서 ghidraRun 스크립트를 실행하면 시작할 수 있다.

3. 분석 실습: Rename & Retype

실제로 분석할 때 가장 중요한 작업 중 하나는 이름 붙이기다. 처음 열면 함수명과 변수명이 전부 의미 없는 형태로 보이는 경우가 많다.

void undefined4 func_123(int iVar1) {
    if (iVar1 == 0xdeadbeef) { ... }
}

그래서 문맥을 보고 func_123이 비밀번호 검증 함수인지, iVar1이 사용자 입력인지 추론해야 한다. 확인이 되면 L로 이름을 바꿔준다.

void check_password(int input_key) {
    if (input_key == 0xdeadbeef) { ... }
}

이렇게 이름을 붙여가며 의미를 복원하는 과정이 리버싱의 핵심에 가깝다. 다만 디컴파일 결과가 항상 맞는 건 아니므로, 왼쪽 Listing View의 어셈블리와 꼭 교차 확인하는 습관이 필요하다.