본문 바로가기
게임해킹/knockon 부트캠프

[3주차 TIL] KnockOn Bootcamp - 아키텍쳐

by HHack 2025. 4. 22.
반응형

 

📘 시스템 아키텍처와 바이너리 구조의 이해


🔍 1.1 폰 노이만 구조란?

🔧 개념

폰 노이만 구조(𝑉𝑜𝑛 𝑁𝑒𝑢𝑚𝑎𝑛 𝐴𝑟𝑐ℎ𝑖𝑡𝑒𝑐𝑡𝑢𝑟𝑒)는 오늘날 대부분의 컴퓨터 시스템이 따르는 메모리 기반 명령 실행 모델이다.

📦 핵심 요소

구성 요소 설명
제어 장치 명령어를 해석하고 제어 신호 생성
연산 장치 계산 및 논리 연산 수행 (ALU)
메모리 명령어와 데이터를 함께 저장
입력/출력 장치 외부와의 정보 송수신 담당
프로그램 카운터 다음 실행할 명령의 주소 저장

⚠️ 리버싱 관점

  • 모든 명령어는 메모리에 저장되어 있고, CPU는 이를 순차적으로 읽어 해석한다.
  • 어셈블리 분석 시 프로그램 카운터(Instruction Pointer)가 다음 실행 위치를 의미함.

💡 1.2 아키텍처란?

**아키텍처(Architecture)**는 CPU가 명령어를 해석하고 처리하는 기계어/하드웨어 정의의 표준이다.
운영체제, 컴파일러, 실행파일은 해당 아키텍처에 맞는 바이너리 포맷을 따르게 된다.

구분 의미
ISA (Instruction Set Architecture) 기계어 명령어의 집합 (ex. x86, ARM)
Microarchitecture 같은 ISA라도 내부 구현이 다름 (ex. Intel vs AMD)

🧠 1.3 아키텍처 종류 및 차이점

🔹 x86 (IA-32)

  • 32비트 인텔 아키텍처
  • 레지스터: EAX, EBX, ECX, EDX 등
  • 주소 공간: 최대 4GB
  • 실행 파일 포맷: PE32, ELF32

📌 리버싱에서 가장 많이 접하게 되는 구조. OllyDbg, x64dbg 기본 환경.


🔹 x86_64 (x64, AMD64)

  • 64비트 아키텍처 (AMD가 설계, Intel이 도입)
  • 레지스터: RAX, RBX, RCX, RDX, RSP, RBP 등
  • 주소 공간: 16EB 이론 한계
  • 실행 파일 포맷: PE32+, ELF64

📌 함수 호출 규약, 스택 구조 등이 x86과 달라 리버싱 시 주의 필요


🔹 ARM (ARMv7, ARM64/AArch64)

  • 모바일/임베디드용 저전력 아키텍처
  • ARMv7: 32비트 / ARM64(AArch64): 64비트
  • R0~R15 레지스터, SP, LR, PC 등 존재
  • 명령어 길이: 고정(32비트), Thumb(16비트)

📌 iOS/Android 리버싱, 모바일 게임 해킹에 필수


🔹 Apple Silicon (M1, M2, M3)

  • ARM64 기반의 커스텀 아키텍처 (AArch64)
  • 기존 x86 실행 파일은 Rosetta2를 통해 에뮬레이션 실행됨
  • 네이티브 ARM64 바이너리는 Intel 환경에서 실행 불가

📌 Intel용 PE 실행 파일은 M1에서 실행 안 됨, 대신 맥은 Mach-O + ARM64 포맷을 사용


🔹 MIPS

  • 임베디드 시스템/공유기/레거시 시스템에서 주로 사용
  • RISC 구조 기반 (명령어 고정 길이)
  • 32개 일반 레지스터

📌 IoT 펌웨어 분석, 공유기 리버싱에 자주 등장


🔹 RISC-V

  • 오픈소스 RISC 구조
  • 점점 채택되는 중 (Linux 지원, 개발 보드 존재)

📌 리버싱보다는 펌웨어 분석, 마이크로컨트롤러 연구 등에 활용


📦 1.4 실행 파일 호환성 – Intel ↔ AMD ↔ ARM ↔ M 시리즈

실행 환경 실행 파일 구조 호환 가능 여부
Intel CPU PE / ELF / x86 ✅ AMD 실행 가능
AMD CPU PE / ELF / x86 ✅ Intel 실행 가능
Apple M1~3 (ARM64) Mach-O / ARM64 ❌ Intel PE 직접 실행 불가 (Rosetta2 필요)
Android (ARM64) ELF / ARM ❌ PC용 바이너리 실행 불가 (에뮬레이터 필요)

📌 리버서 주의점

  • x86 바이너리를 ARM에서 분석하려면 변환 계층(Rosetta2, QEMU, Unicorn 등)이 필요
  • 분석 대상의 아키텍처를 먼저 확인하고, 그에 맞는 디스어셈블러(IDA, Ghidra, Radare2 등) 설정 필수

✅ 정리

  • 아키텍처는 명령어 해석 구조이며, 실행 파일은 특정 아키텍처에 종속된다.
  • 리버싱에서 아키텍처를 파악하지 않으면, 어셈블리 코드 분석이 아예 불가능해진다.
  • x86, x64, ARM은 실전 분석에서 반드시 구분하고 익숙해져야 할 핵심 대상이다.

🔍 실전 과제 제안

  1. Ghidra 또는 IDA에서 x86과 x64, ARM 바이너리를 각각 열어보고 레지스터, 명령어 구조를 비교해보자.
  2. 파일의 아키텍처를 file, readelf -h, objdump -f 명령어로 구분해보자.
  3. Rosetta2 환경에서 실행되는 Intel 바이너리의 실제 동작 경로를 추적해보자 (Mac 기준).
  4. 각 ISA별 어셈블리 예제 + 디스어셈블 비교
반응형