Notice
Recent Posts
Recent Comments
Link
«   2026/07   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

방망이

[프로젝트]UEFI DXE 바이너리 취약점 분석기 13주차 - P-code Phase1 본문

2026_졸업프로젝트

[프로젝트]UEFI DXE 바이너리 취약점 분석기 13주차 - P-code Phase1

망구입니다 2026. 5. 12. 18:56

01 어셈블리 기초

핵심 레지스터 (x86-64)

RAX
64-bit accumulator
함수 반환값, 산술 연산

RBP
base pointer
스택 프레임 기준점

RSP
stack pointer
현재 스택 탑 위치

RIP
instruction pointer
다음 실행할 명령어 주소

RDI/RSI
1st / 2nd argument
함수 인자 (Linux x64)

RDX/RCX
3rd / 4th argument
함수 인자 (Linux x64)

 

 

 

어셈블리 읽기 — 실제 예제
아래는 int add(int a, int b) { return a + b; } 의 컴파일 결과입니다
 

0x1129   push  rbp                      ; 호출자 RBP 저장
0x112a   mov   rbp, rsp               ; 새 스택 프레임 설정
0x112d   mov   [rbp-0x4], edi      ; 인자 a 저장
0x1130   mov   [rbp-0x8], esi      ; 인자 b 저장
0x1133   mov   eax, [rbp-0x4]     ; a → EAX
0x1136   add    eax, [rbp-0x8]     ; EAX = a + b
0x1139   pop    rbp                      ; 프레임 해제
0x113a   ret                                 ; EAX에 결과 담아 반환

 

 

 

스택 프레임 구조

02 Ghidra  도구

 

핵심 뷰 & 도구

  • CodeBrowser
    • 메인 분석 뷰. 어셈블리 ↔ P-code 전환, 심볼 레이블링, 참조 추적. 오른쪽 클릭 → "Show Pcode"로 Raw P-code 확인 가능.
  • Decompiler
    • 어셈블리 → C 유사 코드로 변환. 내부적으로 High P-code를 사용. 변수 이름 재지정, 타입 선언 적용 가능.
  • Script Manager
    • Java / Python(Jython) 스크립트 실행 환경. P-code 자동 분석기 개발의 시작점. GhidraScript API 전체 사용 가능.
  • Function Graph
    • 제어 흐름 그래프(CFG) 시각화. 기본 블록 단위로 구조 파악. P-code 분석의 CFG 개념을 시각적으로 확인.
  • Symbol Tree
    • 함수, 심볼, 레이블 전체 목록. 분석 대상 함수를 빠르게 찾고 Import/Export 구조 파악.
  • Auto Analysis
    • 바이너리 최초 임포트 시 실행. Disassembly, Function Discovery, Reference Analysis 등 파이프라인 자동 수행.

 

 

 

P-code 보는 방법 — 12.0 이 버전 기준
1. 함수 열기
Symbol Tree에서 함수 더블클릭 → CodeBrowser에 어셈블리 표시

2. Low P-code

  • 1단계 — Tool Options에서 먼저 활성화:
    • Edit → Tool Options → Listing Fields → Pcode Field → "Display Raw Pcode" 체크 ON
  • 2단계 — Listing 뷰 우상단 "Edit the Listing Fields" 아이콘 클릭:
    • Listing 뷰 오른쪽 상단에 있는 ≡ 같은 아이콘 클릭 PCode 항목 찾아서 우클릭 → "Enable Field" 클릭하여 활성
  • 활성화가 완료되면 각 어셈블리 명령어 아래에 매핑된 Low P-code가 실시간으로 표시

3. High P-code

  • Ghidra 12.0은 GUI가 없어서 따로 설정이 필요하다는데, 다양한 방법 공유 부탁드립니다.

03 컴파일러 &  IR

왜 IR이 필요한가?

IR(중간 표현, Intermediate Representation) 을 사용하면 분석 알고리즘을 한 번만 구현해도 수십 개의 아키텍처에 적용할 수 있음. P-code가 바로 Ghidra의 IR이며, x86 명령어든 ARM 명령어든 모두 P-code로 변환된 뒤 분석.

 

 

 

SSA Form (단일 정적 대입)
P-code의 High 레이어는 SSA form을 사용. 각 변수는 정확히 한 번만 정의되므로, 데이터 흐름을 추적하기 훨씬 쉬워짐.

 

 

 

Basic Block & CFG
Basic Block은 연속된 명령어의 묶음으로, 중간에 분기가 없음. CFG(Control Flow Graph)는 이 블록들 사이의 분기 관계를 그래프로 표현. P-code 분석기는 CFG를 순회하며 각 블록의 P-code를 처리.
 
 

 

어셈블리 → P-code 변환 예시
같은 동작을 어셈블리와 P-code로 비교