CS/소프트웨어보안

4-2. GDB 실습

arsenic-dev 2025. 10. 15. 04:29

경희대학교 장대희 교수님의 소프트웨어보안 수업을 기반으로 정리한 글입니다.

 

실습환경 구축

WSL

 

pwndbg

 

GDB란?

GDB는 GNU(그누) Debugger의 약자로, 표준 디버거이다. (동적 분석)

 

주요 기능

  • Breakpoint: 원하는 코드 지점에서 실행을 멈추고 상태 확인
  • 단계 실행(Step/next): 코드 한 줄씩 실행해 흐름 추적
  • 메모리/레지스터 확인: 변수 값, 스택, 힙, CPU 레지스터 값 보기
  • 메모리 수정: 변수나 메모리 값을 임의로 바꾸기 가능
  • 코어덤프 분석: 프로그램이 크래시 났을 때 원인을 분석

⭐ 브레이크 포인트란 디버거가 제공하는 기능으로, 프로그램을 일시적으로 멈추는 것을 말한다.

이렇게 프로그램을 멈춰야 특정 시점의 메모리를 볼 수 있다. 때문에 브레이크 포인트를 거는 것은 매우 중요하다.

 

※ core dump: 컴퓨터 프로그램이 특정 시점에 작업 중이던 메모리 상태를 기록한 것으로, 보통 프로그램이 비정상적으로 종료했을 때 만들어진다.

 

특징

  • CLI 기반
  • C, C++, 어셈블리 기반 바이너리 분석에 특화
  • pwndbg 등 다양한 확장 플러그인 존재 (그냥 GDB는 너무 CLI라 사용 어려움)

 

소프트웨어 보안에서 GDB

  • 프로그램이 어떻게 메모리에 배치되는지 관찰 가능
  • 익스플로잇 과정에서 스택/힙 덮어쓰기 효과를 실시간으로 확인 가능

gdb

 

pwndbg

 

GDB & Pwndbg Cheat Sheet

 

GDB 사용법

symbol이 없으면 함수의 주소를 IDA로 찾아 주소를 넣으면 됨
symbol로 break 설정 시, stack frame 구성, 변수 공간 할당하는 부분들을 제외하고 실질적으로 코드가 움직이는 곳에 걸림
target 함수가 따로 있지 않는 이상, 프로그램을 정확하게 분석하기 위해서는 main에서부터 어떤 행위를 하는지 확인하는 것이 중요

 

GDB 실습

소스 코드

 

리버싱이나 분석을 하기 전에는, 해당 프로그램이 무엇을 하는 프로그램인지 알기 위해 실행 시켜보는 게 좋다.

 

※ cd ~: 홈으로 이동

 

pwndbg 실행 시, 인자로 파일을 줘야 함

 

실습 1: 프로그램의 메모리 영역을 확인 

 

실습 2: 각 변수들이 프로그램의 메모리 영역 범위 내에 있는지 확인

p: print

 

실습 3: num 변수의 최종 값을 확인

 

※ rbp, rsp

  • rsp (stack pointer): 스택의 “현재 탑”을 가리킴. 함수 호출/리턴/푸시/팝에 의해 자주 변함.
  • rbp (frame pointer): 함수 내에서 고정된 기준으로 사용되며, 디버깅/프레임 탐색에 안정적.

 

실습 4: secret 변수의 값을 디버거로 조작해 flag 획득