VPSSpark 블로그
← 개발 일기로

Ghidra 2026 튜토리얼: NSA 오픈소스 리버스 엔지니어링 도구 설치, 디컴파일, 디버깅, 바이너리 분석

서버 메모 · 2026.09.18 · 약 14분

자주 찾는 키워드: Ghidra 2026 · Ghidra 12.1.3 · 디컴파일 · 바이너리 분석 · NSA

MacBook 화면에 스타일시트 코드가 열려 있는 근접 촬영
디컴파일 결과는 가설이다. 주소와 바이트를 먼저 맞춘다.

2026년 8월 18일 NSA는 GitHub에 Ghidra 12.1.3을 올렸다. 받아야 할 파일은 ghidra_12.1.3_PUBLIC_20260817.zip(약 543 MB)이고 SHA-256은 릴리스 페이지에 있다. 「Ghidra 2026 튜토리얼」에서 막히는 사람은 대개 JDK를 틀리고, Source Code를 받고, 권한 없는 소프트웨어로 연습한다. 이 글은 설치·디컴파일·디버그·바이너리 분석까지 잇는다. 대상은 직접 컴파일한 프로그램, 회사가 명시한 샘플, 격리 랩의 연구 자료뿐이다.

Ghidra는 “원본 소스를 되살리는 마법”이 아니다. NSA의 오픈소스 리버스 프레임워크로, 디스어셈블·디컴파일·교차 참조·스크립트·디버거가 한 Project에 모인다. 2026년에도 배울 이유는 무료·크로스플랫폼이고 구조를 읽는 힘이 상용 도구와 같은 급이기 때문이다. 12.1 라인은 런타임을 JDK 21에 고정하고 디버거에는 Python 3.9–3.14가 필요하다. 공식 Getting Started와 What's New in Ghidra 12.1을 먼저 읽고, 3년 전 스크린샷을 믿지 마라.

12.1.3
공개 빌드 2026-08-18
JDK 21
64비트, PATH 또는 JAVA_HOME
4 GB+
공식 최소 RAM. 대용량은 16 GB
ghidraRun 전에 빨간 선을 그어라
디컴파일과 디버깅은 허가된 범위에서만. 상용 소프트웨어 크랙, 라이선스 우회, 타인 시스템 무단 접속은 범위 밖이다. 권한이 애매하면 멈춰라. 알 수 없는 샘플은 격리 머신에서, 은행과 회사 메일이 들어 있는 일상 노트북에서는 열지 마라.

2026년에 생 어셈블리 창만 보지 않는 이유

보안 연구와 펌웨어 분류에서 시간이 사라지는 지점은 “명령이 보인다”가 아니라 함수 이름을 바로잡고, 타입을 되돌리고, xref로 누가 누구를 부르는지 따라가는 일이다. Ghidra의 가치는 여기에 있다. Listing은 바이트, Decompiler는 읽을 수 있는 유사 C, 커서는 같이 움직인다. 변수 이름을 바꾸면 C 창이 바로 말을 바꾼다. 포스트잇보다 한 자릿수 빠르다.

다른 이득은 프로젝트 위생이다. Project에 파일, 분석 플래그, 북마크, 주석이 남는다. 같은 CLI를 두 사람이 볼 때 스크린샷을 주고받는 대신 프로젝트를 공유한다. 12.1에는 Headless, PyGhidra, BSim도 있지만 이 글은 GUI 본선만 다룬다.

공식 바닥은 RAM 4 GB, 설치 1 GB, 듀얼 모니터 권장이다. “열린다”의 하한이다. 수십 MB 펌웨어를 통째로 넣으면 16 GB가 편하고, 브라우저와 싸우지 않으려면 32 GB다. 산술 감각은 OpenClaw 2.0 VPS 실측: Linux 클라우드에 CPU·메모리·디스크는 얼마나 필요한가와 같다. 도구는 달라도 장시간 분석은 CPU보다 RAM이 먼저 죽는다.

Ghidra 2026 네 단계: 설치, 가져오기와 분석, 디컴파일, 디버그와 교차 참조
순서를 뒤집지 마라. 공식 ZIP을 검증하고, 자신의 프로그램을 넣고, 구조를 읽고, 디버그는 권한이 있는 대상만.

설치: 먼저 JDK 21, 그다음 공식 ZIP. 소스 묶음은 받지 마라

Ghidra 12.1은 64비트 JDK 21이 필요하다. 17이나 11만 있으면 런처가 21을 찾고, 없으면 Java home을 묻는다. Windows·macOS·Linux 모두 같다. 공식 무료 LTS는 Adoptium Temurin과 Amazon Corretto. Adoptium Temurin 릴리스 페이지에서 21을 넣고 java -version이 21을 찍는지, JAVA_HOME이 JDK 루트(bin의 부모)를 가리키는지 확인한다.

Releases의 Assets에서 멀티플랫폼 ZIP(ghidra_12.1.3_PUBLIC_20260817.zip)을 받는다. “Source Code (zip)”는 Gradle로 직접 빌드할 사람용이다. 12.1.3 SHA-256은 93a5d11a9ad510622acaaf908c556a7b9b764d338e78a7567f3689bf5081fd54. 로컬에서 해시를 내고 다르면 지우고 다시 받는다.

공식 패키지 검증 (macOS / Linux)
shasum -a 256 ghidra_12.1.3_PUBLIC_20260817.zip
                # 기대값: 93a5d11a9ad510622acaaf908c556a7b9b764d338e78a7567f3689bf5081fd54

쓸 수 있는 디렉터리에 푼다. 동기화가 잠그는 클라우드 드라이브 뿌리는 피한다. 실행은 ./ghidraRun 또는 ghidraRun.bat. 디버거와 PyGhidra에는 Python 3.9–3.14가 필요하다. macOS LLDB는 대개 Xcode와 오고, Linux GDB는 13 이상이며 임베디드 Python 3이 좋다. 배포판 패키지는 늦는 일이 많으니 학습은 GitHub 공식 ZIP으로 맞춘다.

네이티브 부품이 OS와 안 맞을 때
ZIP에는 최소 한 플랫폼의 Decompiler 네이티브가 들어 있다. 오래된 glibc나 빠진 플랫폼이면 Getting Started대로 네이티브를 다시 만든다. 디컴파일 창이 비거나 GNU Demangler가 죽는 증상은 대개 이것이다.

첫 세션: Project, Import, Analyze를 연타하지 마라

File → New Project. 혼자면 Non-Shared면 충분하다. 넣는 것은 직접 컴파일한 실행 파일이나 권한이 있는 샘플이다. 마법사가 맞힌 형식(ELF / Mach-O / PE)과 언어(x86:LE:64, AARCH64:LE:64)를 확인한다. Apple Silicon Mach-O는 AARCH64, x86_64 Linux 빌드는 x86-64. 언어를 틀리면 함수 경계가 하루 종일 깨진다.

CodeBrowser에 들어가면 Auto Analysis를 묻는다. 작은 교재 바이너리는 기본값으로 충분하다. 거대한 펌웨어는 비싼 분석기를 끄고 첫 화면의 유사 C를 먼저 본다. 진행 바가 끝나기 전에 이름을 바꾸지 마라. 이후 패스가 덮어쓴다.

끝나면 좌표계를 만든다. Imports / Exports, Defined Strings, Functions. 라이브러리, 오류 문자열과 URL, 자동 분석이 메인 경로를 잘게 썰었는지. 이 세 창이 entry로 바로 뛰어드는 것보다 빠르다.

디컴파일러: 왼쪽 Listing, 오른쪽 유사 C, 가운데는 이름

명령을 클릭하면 C가 따라오고, 변수를 클릭하면 Listing이 강조된다. 이 왕복이 기본기다. 주석과 타입을 못 보는 채팅에 유사 C를 붙여 넣는 것보다 믿음직하다.

출력 품질은 넣은 타입을 따른다. 기본 undefined4와 char *는 초안이다. L로 타입, ;로 주석, 함수 이름은 어느 창에서든 바꾼다. FUN_100003f80을 parse_config_line으로 바꾸면 모든 xref 라벨이 바뀐다. 이름은 가설이다. 다음 xref가 틀린 이름을 때려 주는 것이 쓸모다.

타입은 헤더와 디버그 심볼에서 빌린다. 자기 빌드라면 DWARF / PDB를 남긴다. 심볼이 벗겨진 배포본은 임포트·문자열·도메인 지식으로 구조체를 천천히 채운다. Data Type Manager에 10분을 쓸 가치가 있다. 설정 블록을 구조체로 만들면 오프셋 무더기가 필드 이름이 된다.

보고 싶은 것창하지 말 것
실제 바이트와 분기Listing주소 없이 C만 믿기
함수가 하는 일Decompiler이름 없는 FUN_*를 결론으로
누가 부르는지References / Function Graph스택 하나로 전역을 추측
어떤 라이브러리Imports / Exports동적 로드 이름 무시

디버그: 방금 만든 프로그램을 먼저 연결하라

12.1 Debugger는 Python으로 호스트 디버거에 붙는다. Linux는 GDB, macOS는 LLDB(대개 Xcode), Windows는 WinDbg 계열. Python 3.9–3.14와 protobuf 등이 필요하다. Ghidra가 디버거를 대체하는 것이 아니라 GDB/LLDB 세션을 Trace에 동기화해 정적 C와 살아있는 레지스터를 나란히 둔다.

합법적인 첫 디버그는 5분 전에 clang / gcc한 작은 프로그램이다. 맞는 launcher를 고르고, 직접 쓴 함수에서 멈추고, 레지스터와 스택이 가설과 맞는지 본다. 틀리면 타입과 이름을 고치고 다시 달린다.

임의 프로세스에 붙는 입구로 쓰지 마라. 운영 서버, 동료 세션, 서면 권한이 없는 환경에는 연결하지 않는다. 알 수 없는 샘플은 호스트 데스크톱에서 돌리지 마라. 스냅샷, VM, 전용 머신이 먼저다. 격리 감각은 VPS에서 OpenClaw 2.0은 안전한가? 7일간 권한·SSH·API Key 점검과 같다. 대상은 달라도 “일상과 실험을 나눈다”는 같은 규율이다.

디버거가 안 뜨면 세 가지부터
Python이 3.9–3.14인지, GDB/LLDB가 같은 Python을 품었는지, 터미널 python3에 넣은 패키지를 다른 마이너가 읽고 있지는 않은지. Debugger Notes는 직설적이다. 커넥터가 어떤 패키지를 어느 머신에 넣을지 알려 준다.

바이너리 분석: 감이 아니라 절차

분석할 권한이 있는 낯선 바이너리에는 순서를 고정한다. 하나, 형식·아키텍처·심볼 여부. 둘, 문자열과 임포트에서 네트워크·파일·암호 라이브러리에 표시. 셋, main / 엔트리에서 주 경로 함수만 이름. 넷, 뜨거운 함수의 Function Graph——오류 처리인가 업무 분기인가. 다섯, 설정 파서로 보이는 함수에 구조체를 넣고 유사 C를 다시 읽는다.

xref가 시간을 산다. 수상한 전역 버퍼를 봐도 작성자를 추측하지 마라. 참조 목록을 연다. 쓰는 쪽은 대개 파서, 읽는 쪽은 사용자. 양끝에 이름을 붙이면 호출 사슬이 드러난다. 북마크는 “내일 돌아올 주소”, 주석은 가설과 반증이지 TODO 더미가 아니다.

스크립트는 반복 작업용이다. 일괄 이름 변경, 문자열 패턴 태그, 함수 목록 내보내기. 처음에는 내장 스크립트로 충분하다. Headless는 자기 산출물의 CI용이다. 릴리스마다 가져와 핵심 함수가 남아 있는지, 임포트 표에 불필요한 라이브러리가 늘지 않았는지 본다. 공격 훈련이 아니라 위생이다.

흔한 실패: Java, 메모리, 글꼴, 원격 화면, 일상 계정

기동 실패의 1위는 Java다. Homebrew java가 25일 수 있고 회사 이미지는 17에 붙어 있으며 Ghidra 12.1은 21만 원한다. JAVA_HOME으로 Temurin 21을 고정한다. 다음은 힙. 큰 펌웨어에서 UI가 언다. 런치 스크립트 옆 설정에서 힙을 키우고 브라우저 디자인 탭을 닫는다.

HiDPI와 원격 데스크톱(클라우드 Mac VNC 포함)은 글꼴과 분할을 비튼다. 두 시간 읽을 크기로 맞춘다. 프로젝트를 iCloud / OneDrive에 두지 마라. 동기화 충돌이 .rep를 찢는다. 로컬 디스크에 두고 직접 묶어 백업한다.

위생: 개인 클라우드, 운영 SSH, 회사 영구 키를 분석기에 올리지 마라. Ghidra 자체보다 넣은 샘플과 동시에 로그인한 것이 위험하다. 전용 클라우드 Mac의 의미는 전원 오프로 격리하고, 스냅샷으로 되돌리며, 무릎 위 노트북을 일상 전용으로 남기는 것이다.

전용 클라우드 Mac이 더 쌀 때
밤새 분석, 일 디스크에 샘플을 올리면 안 되는 경우, JDK 21 + Ghidra 12 + Xcode/LLDB만 있는 깨끗한 머신이 필요할 때. 가정용 공유 PC와 회사 노트북은 장소가 아니다. 일 단위 Apple Silicon은 “이번엔 홈을 안 쓴다”고 도박하는 것보다 싸다.

FAQ

Ghidra 12.1.3은 Apple Silicon에서 돌아가나?

된다. Java 앱이므로 aarch64 JDK 21을 넣는다. Mach-O는 언어를 AARCH64로, 디버그는 LLDB. 네이티브가 안 맞으면 Getting Started대로 ZIP에서 다시 만든다.

꼭 12.1.3인가. 11.x는 안 되나?

옛 프로젝트는 열릴 수 있어도 런타임은 옮겨야 한다. 12.1은 JDK 21이 필요하고 12.1.3은 이전 문제를 고친다. 새 머신은 현재 공개판에서 시작한다.

디컴파일 C를 소스로 제출해도 되나?

안 된다. 추측이 섞인 유사 C다. 타입·별칭·최적화된 제어 흐름이 거짓말한다. 읽기 보조이지 컴파일 가능한 복원이 아니다. 결론은 Listing과 동적 행동과 같이 낸다.

악성코드를 분석해도 되나?

합법 연구 맥락과 격리 환경이 있으면 된다. 일상 OS에서 알 수 없는 샘플을 열지 말고, 통제 없는 공유에도 두지 마라. 이 글은 악용·유포 절차를 다루지 않는다.

Ghidra 12 · 격리 분석기

디컴파일을 일상 노트북에서 빼내라

Ghidra 12.1은 JDK 21이 필요하고 큰 파일은 RAM을 먹으며 디버그에는 깨끗한 LLDB/Python이 필요하다. 브라우저 프로필, 회사 메일, 동기화 클라이언트와 같은 디스크에 두지 마라. 클라우드 Mac mini는 대기 전력이 낮고 스냅샷이 되며 Apple Silicon 대역폭은 밤새 분석을 버틴다. 전원을 끄면 샘플은 무릎 위에 남지 않는다.

클라우드 Mac 요금제 보기 →

한정

Ghidra만 돌릴 격리 Mac이 필요하세요?

JDK 21 · Ghidra 12 · 전용 클라우드 Mac · 일/월

홈
한정 혜택 요금제 보기