ghidra
프레임워크NationalSecurityAgency/ghidra
Ghidra는 컴파일된 코드를 분석하기 위한 소프트웨어 리버스 엔지니어링 프레임워크입니다.
개요
Ghidra는 미국 국가안보국(NSA)이 개발한 소프트웨어 리버스 엔지니어링 프레임워크로, 디스어셈블리, 디컴파일, 그래프 분석 및 스크립팅 기능을 갖추고 있으며, 다양한 프로세서 아키텍처와 실행 파일 형식을 지원하고 Java 또는 Python을 통해 확장할 수 있습니다.
README 미리보기
\n\n# Ghidra Software Reverse Engineering Framework\nGhidra is a software reverse engineering (SRE) framework created and maintained by the \n[National Security Agency][nsa] Research Directorate. This framework includes a suite of \nfull-featured, high-end software analysis tools that enable users to analyze compiled code on a \nvariety of platforms including Windows, macOS, and Linux. Capabilities include disassembly, \nassembly, decompilation, graphing, and scripting, along with hundreds of other features. Ghidra \nsupports a wide variety of processor instruction sets and executable formats and can be run in both \nuser-interactive and automated modes. Users may also develop their own Ghidra extension components \nand/or scripts using Java or Python.\n\nIn support of NSA's Cybersecurity mission, Ghidra was built to solve scaling and teaming problems \non complex SRE efforts, and to provide a customizable and extensible SRE research platform. NSA has \napplied Ghidra SRE capabilities to a variety of problems that involve analyzing malicious code and \ngenerating deep insights for SRE analysts who seek a better understanding of potential \nvulnerabilities in networks and systems.\n\nIf you are a U.S. citizen interested in projects like this, to develop Ghidra and other \ncybersecurity tools for NSA to help protect our nation and its allies, consider applying for a \n[career with us][career].\n\n## Security Warning\n**WARNING:** There are known security vulnerabilities within certain versions of Ghidra. Before \nproceeding, please read through Ghidra's [Security Advisories][security] for a better understanding \nof how you might be impacted.\n\n## Install\nTo install an official pre-built multi-platform Ghidra release: \n* Install [JDK 21 64-bit][jdk]\n* Download a Ghidra [release file][releases]\n - **NOTE:** The official multi-platform release file is named \n `ghidra___.zip` which can be found under the "Assets" drop-down.\n Downloading either of the file
FAQ (5)
문제 해결Ghidra가 옵코드 `8E D8`을 `MOV DS, AX` 대신 `MOV AX, DS`로 표시하는 문제를 해결하는 방법은?
이것은 커밋 GP-7018로 인해 발생한 Ghidra 12.1.3 및 12.1.4의 회귀 버그입니다. x86 SLEIGH 명세가 MOV opcode 0x8e에 대해 세그먼트 레지스터와 범용 레지스터를 잘못된 순서로 표시합니다.
로컬에서 수정하려면 Ghidra/Processors/x86/data/languages/ia.sinc를 편집하고 영향을 받는 생성자 이름을 다음에서:
:MOV Rmr16,Sreg ... { Sreg = Rmr16; }
:MOV Rmr32,Sreg ... { Sreg = Rmr32(0); }
:MOV Rmr64,Sreg ... { Sreg = Rmr64(0); }
다음으로 변경하세요:
:MOV Sreg,Rmr16 ... { Sreg = Rmr16; }
:MOV Sreg,Rmr32 ... { Sreg = Rmr32(0); }
:MOV Sreg,Rmr64 ... { Sreg = Rmr64(0); }
표시되는 피연산자 순서만 변경되며, 시맨틱 액션은 반드시 Sreg = ...로 유지되어야 합니다.
그런 다음 Ghidra 설치 루트에서 x86 SLEIGH 바이너리를 다시 빌드하세요:
support/sleigh -a Ghidra/Processors/x86
Ghidra를 재시작하고 프로그램을 다시 여세요. 그러면 바이트 8e d8에 대한 명령어가 MOV DS,AX로 올바르게 디스어셈블됩니다. 이 수정은 PR #9637로 제출되었으므로, 해당 수정이 포함된 릴리스로 업그레이드하는 것이 영구적인 해결 방법입니다.
문제 해결명령어에 8개를 초과하는 피연산자가 있는 경우 Sleigh 디컴파일러 오류 "Index 8 out of bounds for length 8"을 수정하는 방법
Ghidra 11.0 이상으로 업그레이드하세요. 이 릴리스에는 Sleigh/Pcode 오퍼랜드의 최대 개수를 이전 제한인 8개를 넘어서 확장하는 커밋 0e9c36b513c4d744fe6c6f7559c049ce1d65266f가 포함되어 있습니다. 이전 버전의 Ghidra를 사용해야 하는 경우, 해결 방법으로 pseudo-opcode 정의를 최대 8개의 오퍼랜드로 줄이세요.
문제 해결16바이트 RDX:RAX 반환에 대한 Ghidra 디컴파일러 오류 "Low-level Error: Forced merge caused intersection"를 어떻게 수정하나요?
이 문제는 Ghidra 12.1.2에서 callee가 기본 void 시그니처를 가지고 있지만 실제로는 RDX:RAX에 16바이트 값을 반환하고, caller가 오직 하나의 조건부 경로에서만 그 값을 주소에 고정된(address-tied) 스택 슬롯에 저장할 때 발생합니다. 디컴파일러가 해당 스택 슬롯을 호출 출력으로 재사용하면서 기존 INDIRECT varnode와 충돌합니다.
영구적 해결 방법: GP-7136이 포함된 빌드로 업그레이드하십시오(커밋 bb33bad196, master에서 수정됨). 이 수정은 문제가 보고된 시점에 12.1.2–12.1.4 또는 12.2 브랜치에는 포함되어 있지 않았습니다.
영향을 받는 버전에서의 해결 방법:
1. ret_pair와 같은 callee 함수를 엽니다.
2. 해당 함수의 시그니처/반환 타입을 편집합니다.
3. 잠긴(locked) 16바이트 구조체 반환 타입을 정의하고 할당합니다. 예시:
struct Pair16 {
undefined8 a;
undefined8 b;
};4. 호출 규약을
__stdcall로 설정하고 시그니처를 적용합니다.5. Decompiler에서 caller를 다시 엽니다.
반환 값이 필요하지 않은 경우, callee의 반환 타입을 void로 변경해도 크래시를 방지할 수 있습니다. 호출 지점에서만 void(void)로 "Override Signature"를 적용하는 것으로는 충분하지 않습니다.
문제 해결6809 또는 H8/300H와 같은 big-endian 타겟에서 Ghidra 디컴파일러가 'Removing unreachable block' 메시지와 함께 도달 가능한 코드를 잘못 제거하는 문제를 해결하는 방법
이것은 Ghidra 12.1.2 big-endian splitflow 버그입니다. 레지스터가 6809 D(A/B)처럼 독립적으로 사용되는 두 반쪽으로 분할될 때, 디컴파일러가 각 조각의 consume mask를 서로 바꿀 수 있습니다. 그러면 살아 있는 조각이 사용되지 않는 것으로 처리되어 0으로 대체되고, 해당 분기가 폴딩되며, 도달 가능한 코드가 삭제됩니다.
임시 해결 방법: 디컴파일러의 splitflow 단순화 규칙을 비활성화하고 다시 디컴파일하십시오. 경고가 사라지고 살아 있는 레지스터 반쪽/조건부 코드가 복원됩니다.
영구 수정: PR "Preserve consume masks for big-endian register splits."를 적용하십시오. TransformVar::createReplacement()에서는 변환된 big-endian 스토리지 오프셋을 대체 varnode 주소를 구성할 때만 계속 사용하고, 원래의 논리적/유효 오프셋은 transferVarnodeProperties()에 전달하십시오. 그런 다음 네이티브 디컴파일러를 다시 빌드하거나, 해당 수정이 포함된 Ghidra 릴리스로 업그레이드하십시오.
살아 있는 반쪽이 변수로 유지되고, 데이터 종속 분기가 보존되며, 루프 이후의 STA 스토어와 같은 코드가 더 이상 도달 불가능으로 보고되지 않는지 확인하여 결과를 검증하십시오.
문제 해결왜 Ghidra 오류 대화 상자는 '<' 문자를 숨기고 스택 트레이스와 다른 텍스트를 표시하나요?
Ghidra 9.1에서 확장 가능한 오류 대화 상자는 일반 텍스트 메시지를 먼저 이스케이프하지 않고 HTML로 렌더링합니다. ErrLogExpandableDialog.getHTML()은 addHTMLContent()를 통해 대화 상자 메시지와 각 Throwable.getMessage()를 삽입하는 반면, addBR()은 줄바꿈만 <br>로 변환합니다. 따라서 <= 64와 같은 텍스트는 HTML 태그로 해석되어 렌더링된 대화 상자에서 사라질 수 있습니다. 기본 메시지는 스택 트레이스나 로그에서는 여전히 올바릅니다: Bit length must be >= 1 and <= 64.
해결 방법: 렌더링된 대화 상자 메시지에 의존하는 대신 전체 스택 트레이스/로그를 복사하거나 읽으십시오.
영구 수정: 모든 일반 텍스트 메시지를 대화 상자에 삽입하기 전에 HTML 이스케이프 처리한 다음 줄바꿈을 <br>로 변환하십시오:
private static String escapePlainText(String s) {
return s.replace("&", "&")
.replace("<", "<")
.replace(">", ">");
}
이를 ErrLogExpandableDialog.getHTML()의 기본 메시지와 Throwable.getMessage() 모두에 적용하고 Ghidra를 다시 빌드하거나, "Escape plain-text messages in the expandable error dialog"라는 제목의 수정 사항이 포함된 빌드를 사용하십시오.