hhkb.dev

BLOG

2025-10-15 / 어셈블리 · 07

GDB(GNU Debugger)를 이용한 런타임 분석

동적 분석은 프로그램을 실제로 실행시키면서 내부 상태 변화를 보는 방식이다. 소스 코드가 없어도 동작 원리를 파악할 수 있어서, 리버싱에서는 거의 필수에 가깝다. 여기서는 GDB에서 가장 자주 쓰는 핵심 명령만 추려서 본다.

1. Breakpoint(중단점)

  • break *0x401000 (b): 특정 주소에 중단점을 건다. 해당 지점에 도달하면 실행이 멈춘다.
  • delete: 걸어둔 중단점을 지운다.

2. Stepping(단계별 실행)

어셈블리 분석에서는 소스 코드 줄이 아니라, 기계어 명령어 단위로 움직여야 한다.

  • ni (Next Instruction): 명령어 한 줄을 실행한다. call이 있어도 내부로 들어가지 않는다.
  • si (Step Instruction): 명령어 한 줄을 실행하되, call 안으로 들어간다.

3. Examine(메모리 검사)

x 명령어는 메모리 내용을 직접 확인할 때 쓴다.

  • x/i $rip: 지금 실행 대기 중인 명령어를 본다.
  • x/s 0x402000: 해당 주소를 문자열로 본다.
  • x/10gx $rsp: 스택을 8바이트 단위로 10개 출력한다. 리턴 주소나 스택 프레임 확인에 유용하다.

4. Info(정보 확인)

  • info registers (i r): 전체 레지스터 값을 본다. 연산 결과와 플래그 상태를 확인할 때 기본이다.

Advanced: GDB 플러그인 활용
기본 GDB 화면은 다소 불친절하다. 그래서 실무에서는 Pwndbg, GEF, Peda 같은 플러그인을 많이 쓴다. 레지스터, 스택, 코드 상태를 한 화면에 보기 좋게 묶어줘서 분석 속도가 훨씬 빨라진다.