디버깅(Debugging)은 프로그램 실행 도중 내부 상태를 관찰하거나 수정하며 동작을 분석하는 과정입니다.
리버싱에서는 주로 바이너리의 숨겨진 동작을 추적하거나, 암호화/압축 해제를 위한 핵심 위치를 찾는 데 활용됩니다.
| 목적 | 설명 |
|---|---|
| 🔍 런타임 동작 확인 | 정적 분석으로 보기 힘든 메모리 변화를 실시간 추적 |
| 🧩 조건 분기 조작 | 인증 우회, 실행 경로 변경 등 |
| 📦 Unpacking | 원래 코드(OEP) 실행 위치를 찾기 위해 |
| 🔐 Anti-Debug 우회 | 탐지 코드 탐색 및 제거 목적 |
| 📈 성능 분석 | 악성 루프, 리소스 낭비, 무한 대기 상태 추적 등 |
| 도구 | 설명 |
|---|---|
| x64dbg | 대표적인 32/64비트 Windows 디버거, GUI 제공 |
| OllyDbg | 32비트 바이너리 분석에 특화된 고전 디버거 |
| Immunity Debugger | Olly 기반, Python 스크립트 확장 가능 |
| WinDbg | Microsoft 공식, 커널 및 사용자 디버깅 지원 |
| GDB | Linux ELF 파일 디버깅 전용 (C 기반 CLI 디버거) |
권장: Windows 사용자 → x64dbg, Linux ELF 분석 → GDB
[ Load ] → [ Set Breakpoint ] → [ Run / Step ] → [ Observe State ] → [ Modify or Dump ]
🔹 Breakpoint (중단점) 설정
Software BP 명령어를 0xCC (INT 3)로 패치
Hardware BP CPU가 감지할 수 있도록 설정 (쓰기/읽기 감지 가능)
Memory BP 특정 메모리 영역 접근 시 중단
예시:
- 프로그램 시작 시 EntryPoint에서 BP
- 인증 함수 앞에서 BP
- VirtualAlloc / CreateProcessA 에서 BP
Step Into (F7) 함수 내부로 진입
Step Over (F8) 함수 실행 후 다음 줄로 이동
Step Out (Ctrl + F9) 현재 함수 종료 시점까지 실행 후 복귀
전체 함수 호출 흐름 확인
특정 조건문이 어떤 값에 의해 분기되었는지 추적
루프, 무한대기 등에서 탈출지점 파악
EAX = 1 등 레지스터 수동 조작
문자열 메모리 수동 변경
패치 없이 조건 분기 우회 가능주요 디버깅 기법
Software BP 명령어를 0xCC (INT 3)로 패치
Hardware BP CPU가 감지할 수 있도록 설정 (쓰기/읽기 감지 가능)
Memory BP 특정 메모리 영역 접근 시 중단
예시:
- 프로그램 시작 시 EntryPoint에서 BP
- 인증 함수 앞에서 BP
- VirtualAlloc / CreateProcessA 에서 BP
Step Into (F7) 함수 내부로 진입
Step Over (F8) 함수 실행 후 다음 줄로 이동
Step Out (Ctrl + F9) 현재 함수 종료 시점까지 실행 후 복귀
전체 함수 호출 흐름 확인
특정 조건문이 어떤 값에 의해 분기되었는지 추적
루프, 무한대기 등에서 탈출지점 파악
EAX = 1 등 레지스터 수동 조작
문자열 메모리 수동 변경
패치 없이 조건 분기 우회 가능