앞서 리버싱의 개요와 활용분야를 살혀봤다면, 이번에는 실제로 리버싱을 하기위한 핵심 개념과 분석 방식에 대해 알아봄
소프트웨어는 처음에 사람이 이해하기 쉬운 고급 언어(
C
,C++
,JAVA
등)으로 작성되고, 컴파일러에 의해 컴퓨터가 실행 가능한 바이너리 파일(기계어)로 변환됨
리버싱은 이 바이너리를 분석하여, 소스코드 수준의 구조와 동작을 역추론하는 과정
소스코드 → Complie → [실행 파일]
↑
리버싱 분석
📌 핵심: "소스 없이 프로그램을 이해하는 기술"이 리버싱의 본질
바이너리는 순수한 기계어지만, 사람이 보기 위해서는 보통 어셈블리어(Assembly) 형태로 디코딩함
어셈블리어는 리버스 엔지니어링에서 가장 핵심적인 분석 언어로,
기계어와 1:1 매칭되는 저수준 언어이며, 바이너리를 해석할 수 있는 가장 직접적인 수단임
어셈블리를 모른 채 리버싱을 하는 것은 지도를 모르고 탐험을 나서는 것과 같음
어셈블리어는 CPU구조에 따라 명령어 집합(Instruction Set)이 다름
아키텍처 | 특 징 |
---|---|
x86 (32비트) | 전통적인 PC 기반 아키텍처, 레지스터 크기 32bit |
x86_64 (64비트) | 64bit OS에서 사용, 레지스터 및 주소 처리 능력 향상 |
ARM | 모바일, IoT 기기에서 많이 사용됨, 저전력 구조 |
리버싱 분석에서 자주 등장하는 명령어와 그 역할
명령어 | 역할 / 분석 포인트 |
---|---|
mov | 데이터 이동 (메모리 ↔ 레지스터) → 변수 저장 위치 추적 |
push / pop | 스택에 값 저장 / 꺼내기 → 함수 호출, 지역 변수 사용 시 |
call / ret | 함수 호출 / 반환 → 함수 흐름, 호출 관계 분석 |
cmp, test | 조건 비교 → 분기 조건 분석 |
jmp, je, jne | 조건 분기 → if/else, loop 구조 추론 |
lea | 주소 계산 → 포인터 연산, 구조체 접근 분석 |
int, syscall | 시스템 콜 → OS 함수 호출 여부 확인 (예: 파일 읽기, 네트워크 통신) |
call sub_401000
→ 특정 함수 호출 → 어떤 기능을 하는지 추적cmp eax, 0x1
/ je 0x401050
→ 조건 비교 후 분기 → 조건문 추론push ebp
/ mov ebp, esp
→ 함수 시작부 → 함수 스택 프레임 구성mov eax, [ebp-0x4]
→ 지역 변수 접근 → 변수 값 추적리버시에서 주로 사용하는 분석 방법은 크게 두 가지가 있음
실행하지 않고 바이너리를 그대로 분석하는 방법.
안전하고 빠르며, 분석자가 프로그램 흐름을 전반적으로 이해할 수 있게 해줌
call
, jmp
등을 통해 함수 호출 관계 확인예: UPX로 패킹된 악성코드는 정적 분석으로 보면 아무 내용도 안 나옴
→ 언패킹 없이 분석 불가
실제로 프로그램을 실행하면서 행위 기반으로 분석하는 방법
실행중의 메모리, 레지스터, 시스템 호출, 네트워크 동작을 추적할 수 있음
예: 분석 환경에서 실행 시 아무런 동작을 안 하는 악성코드는,
실제 사용자 PC에서만 악성 행위를 실행하도록 설계되어 있음
구 분 | 정적 분석 | 동적 분석 |
---|---|---|
실행 여부 | 프로그램 실행 안함 | 프로그램 실행함 |
분석 대상 | 바이너리 파일 | 실행 중 프로세스 |
장 점 | 전체 구조 파악 가능, 탐지 위험 없음 | 실제 동작 확인 가능, 숨겨진 동작 발견 가능 |
단 점 | 난독화 대응 어려움, 동작 추론 한계 | 환경 구축 복잡, 탐지될 수 있음 |
용 도 | 코드 흐름 이해, 취약점 탐색 | 악성 행위 분석, 디버깅 |
대부분의 리버싱 작업은 정적 분석 + 동적 분석을 병행
정적 분석은 “지도 보기”, 동적 분석은 “현장 답사”에 해당두 접근을 함께 써야 전체 구조와 실제 행위를 모두 이해할 수 있음
Windows 환경에서 주요 리버싱 대상은
.exe
,.dll
파일 등이며, 이들은 모두 PE(Portable Excutable)포맷을 따름
이 구조를 이해하면, 어떤 코드가 실제로 실행되는지, 그리고 악성 코드가 삽입될 가능성이 있는 위치를 추적할 수 있음
고급 언어(
C
,C++
,JAVA
등)로 작성된 소스코드를 기계어(바이너리)로 변환하는 프로그램
.exe
,.dll
,.elf
등 실행 가능한 파일바이너리 파일을 다시 고급 언어 형태로 역변환해 주는 도구
구 분 | 컴파일러 | 디컴파일러 |
---|---|---|
역 할 | 고급 언어 → 기계어 변환 | 기계어 → 고급 언어 형태 역변환 |
목 적 | 실행 가능한 프로그램 생성 | 분석 및 이해 용이성 제공 |
결과물 | 정확하고 최적화된 바이너리 | 근사치 코드, 원본과 차이 있음 |
한 계 | 소스코드가 필요함 | 완전한 소스 복원 불가 |