sh711 님의 블로그

gdb & pwndbg 본문

Tools/gdb

gdb & pwndbg

sh711 2025. 3. 4. 23:28

gdb는 프로그램을 동적으로 분석할 수 있는 동적 분석 도구이다.

strace 등과 같이 ptrace를 사용해 프로그램 실행 흐름을 제어할 수 있으며 가장 기본적인 디버깅 도구이다.

1. 설치

gdb를 설치해준다.

apt-get update
apt install gdb

 

프로그램 gdb 디버깅

 

주로 사용되는 옵션 및 명령

gdb 프로그램 이름

gdb attach -p [PID] : pid 프로세스 디버깅

run : 실행

entry : ELF 헤더를 기준으로 entry 포인트 진입

start : main() 함수 진입

disassemble 함수명 : 함수 디스어셈블

set disassembly-flavor intel : intel 방식의 표현으로 바꿔줌

break *메모리 : 특정 위치 브레이크 포인트

info registers : 레지스터 상태 확인

info functions : 함수 정보 확인

ni = next

si = step into

set $eflags = $eflags | 0x40 : 제로 플래그 생성

set $eflags &= ~0x40 : 제로 플래그 해제

info proc mapping : 로드된 메모리 영역 확인

set {char[4]}0x000055555555513d = {0x00,0x00,0x00,0x00} : 메모리 값 변경

 

2. 예제

프로그램 예제

// gcc -o test test.c
#include <stdio.h>
#include <stdlib.h>

int main() {
        printf("Welcome to GDB!!");
        return 0;
}

 

start 입력 시 main 함수 진입 후 브레이크가 걸린다.

 

AT&T 표기에서 intel 방식 표기로 바꿔준다.

 

일반 gdb에서는 ni나 브레이크가 걸리면 따로 정보를 보여주지 않기 때문에 hook-stop(브레이크) 동작 시 사용자 정의로 원하는 작업을 수행할 수 있다.

(gdb) define hook-stop
> info registers
> x/30xg $rsp-0x30
> undisplay
> display/10i $pc
> end

 

브레이크마다 현재 컨텍스트 확인이 가능하다.

 

 

3. pwndbg

Pwndbg는 GDB(GNU Debugger)의 플러그인 중 하나이며 GDB의 기능을 확장해서 익스플로잇 개발(Exploit Development)과 CTF 문제 풀이를 더 쉽게 할 수 있도록 도와주는 디버깅 도구이다.

보통 파이썬의 pwntools 라이브러리와 같이 사용된다.

 

git에서 pwndbg 파일을 가져온다. 

git clone https://github.com/pwndbg/pwndbg

 

 

pwndbg 디렉터리 안에 setup.sh를 실행한다.

 

gdb 실행 시 기존의 gdb에 비해 컨텍스트가 보기 편하며 각 메모리 주소의 값도 보여주어 분석 과정에서 훨씬 편하게 진행할 수 있다.

 

4. pwntools

다음 명령어로 파이썬 라이브러리를 설치해준다

pip install pwntools

 

기본 코드

ELF('binary')	ELF 파일 객체 생성

process('binary')	로컬에서 실행

remote('IP', PORT)	원격 서버 연결

send(), sendline()	데이터 전송

recv(), recvline()	데이터 수신

p32(0xdeadbeef), p64(0xdeadbeef)	Little Endian 변환

u32(data), u64(data)	Little Endian 해석

interactive()	인터랙티브 모드

 

 

예를 들어, 다음과 같이 입력을 받고 입력받은 문자열을 출력해주는 프로그램이 있으면

 

다음과 같이 코드를 작성할 수 있다

from pwn import *

io = process("./test")

input_text = "Hello_Pwntools"

io.sendline(input_text)

print(io.recv(1024).decode())

 

코드 실행 시 문자열을 받아서 출력된것을 확인할 수 있다

 

pwndbg 설치 후 일반 gdb만 실행되는 경우

~/.gdbinit 파일 내 다음 내용을 추가한다.

source {pwndbg 경로}/gdbinit.py