리버싱 - 디버깅

m0ng·2025년 6월 17일

디버깅이란?

디버깅(Debugging)은 프로그램 실행 도중 내부 상태를 관찰하거나 수정하며 동작을 분석하는 과정입니다.
리버싱에서는 주로 바이너리의 숨겨진 동작을 추적하거나, 암호화/압축 해제를 위한 핵심 위치를 찾는 데 활용됩니다.


리버싱에서 디버깅이 필요한 이유

목적설명
🔍 런타임 동작 확인정적 분석으로 보기 힘든 메모리 변화를 실시간 추적
🧩 조건 분기 조작인증 우회, 실행 경로 변경 등
📦 Unpacking원래 코드(OEP) 실행 위치를 찾기 위해
🔐 Anti-Debug 우회탐지 코드 탐색 및 제거 목적
📈 성능 분석악성 루프, 리소스 낭비, 무한 대기 상태 추적 등

주요 디버깅 도구

도구설명
x64dbg대표적인 32/64비트 Windows 디버거, GUI 제공
OllyDbg32비트 바이너리 분석에 특화된 고전 디버거
Immunity DebuggerOlly 기반, Python 스크립트 확장 가능
WinDbgMicrosoft 공식, 커널 및 사용자 디버깅 지원
GDBLinux 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 / Over / Out

Step Into (F7)	함수 내부로 진입
Step Over (F8)	함수 실행 후 다음 줄로 이동
Step Out (Ctrl + F9)	현재 함수 종료 시점까지 실행 후 복귀

🔹 Tracing (흐름 추적)

전체 함수 호출 흐름 확인

특정 조건문이 어떤 값에 의해 분기되었는지 추적

루프, 무한대기 등에서 탈출지점 파악

🔹 메모리/레지스터 조작

EAX = 1 등 레지스터 수동 조작

문자열 메모리 수동 변경

패치 없이 조건 분기 우회 가능주요 디버깅 기법

🔹 Breakpoint (중단점) 설정

Software BP	명령어를 0xCC (INT 3)로 패치
Hardware BP	CPU가 감지할 수 있도록 설정 (쓰기/읽기 감지 가능)
Memory BP	특정 메모리 영역 접근 시 중단

예시:

- 프로그램 시작 시 EntryPoint에서 BP
- 인증 함수 앞에서 BP
- VirtualAlloc / CreateProcessA 에서 BP

🔹 Step Into / Over / Out

Step Into (F7)	함수 내부로 진입
Step Over (F8)	함수 실행 후 다음 줄로 이동
Step Out (Ctrl + F9)	현재 함수 종료 시점까지 실행 후 복귀

🔹 Tracing (흐름 추적)

전체 함수 호출 흐름 확인

특정 조건문이 어떤 값에 의해 분기되었는지 추적

루프, 무한대기 등에서 탈출지점 파악

🔹 메모리/레지스터 조작

EAX = 1 등 레지스터 수동 조작

문자열 메모리 수동 변경

패치 없이 조건 분기 우회 가능

0개의 댓글