반응형
📘 시스템 아키텍처와 바이너리 구조의 이해
🔍 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은 실전 분석에서 반드시 구분하고 익숙해져야 할 핵심 대상이다.
🔍 실전 과제 제안
- Ghidra 또는 IDA에서 x86과 x64, ARM 바이너리를 각각 열어보고 레지스터, 명령어 구조를 비교해보자.
- 파일의 아키텍처를 file, readelf -h, objdump -f 명령어로 구분해보자.
- Rosetta2 환경에서 실행되는 Intel 바이너리의 실제 동작 경로를 추적해보자 (Mac 기준).
- 각 ISA별 어셈블리 예제 + 디스어셈블 비교
반응형
'게임해킹 > knockon 부트캠프' 카테고리의 다른 글
[3주차 TIL] KnockOn Bootcamp - 링커와 로더 (0) | 2025.04.22 |
---|---|
[3주차 TIL] KnockOn Bootcamp - 컴파일러 (0) | 2025.04.22 |
[2,3주차 TIL] KnockOn Bootcamp - 프로젝트 만들기 (0) | 2025.04.15 |
[2주차 TIL] KnockOn Bootcamp - 탐색 알고리즘 (0) | 2025.04.15 |
[2주차 TIL] KnockOn Bootcamp - 정렬 알고리즘 (0) | 2025.04.15 |