System Hacking/Basics

[시스템 해킹] gdb/pwndbg 사용법

hanbunny 2025. 3. 7. 18:47

파일 생성 후 컴파일

nano debugee.c // nano 로 debugee.c 파일 생성

파일 안에 기본적인 코드를 넣어줌.

gcc -o debugee debugee.c -no-pie -g // debugee.c 파일 컴파일

Entry

$ readelf -h debugee // ELF(Executable and Linkable Format) 헤더 정보를 출력

ELF( Executable and Linkable Format) 은 리눅스 실행파일의 형식임.

ELF는 헤더와 여러 섹션으로 구성됨.

 

헤더를 보면 Entry point (EP)가 있다. 운영체제는 ELF를 실행할 때 EP 값부터 프로그램을 실행함.

여기서 EP는 0x401050  이다.

 

pwndbg> entry //현재 디버깅 중인 실행 파일의 엔트리 포인트(Entry Point) 주소를 출력

 

DISASM영역의 화살표(►)가 가리키는 주소는 현재 rip의 값이다.

아까 본 EP의 주소와 일치하다.

 

위에 4개의 영역으로 나뉘어 있는데

REGISTERS: 레지스터의 상태를 보여줌

DISASM: rip부터 여러 줄에 걸쳐 디스어셈블된 결과를 보여줌

STACK: rsp부터 여러 줄에 걸쳐 스택의 값들을 보여줌

BACKTRACE: 현재 rip에 도달할 때까지 어떤 함수들이 중첩되어 호출됐는지 보여줌


Break / Continue

break는 특정 주소에 중단점(breakpoint)을 설정하는 기능이고, continue는 중단된 프로그램을 계속 실행시키는 기능이다.

pwndbg> b *main // main까지 실행
pwndbg> c // 중단 후 계속 실행

 


Run

프로그램 처음부터 끝까지 단순 실행

pwndbg> r

 


disassembly

pwndbg> disassemble main // 메인함수 디스어셈블 u, nearpc, pdisass도 사용 가능

 

 


navigate

관찰하고자 하는 함수의 중단점에 도달했으면, 그 지점부터는 명령어를 한 줄씩 자세히 분석해야 함.

 

pwndbg> ni 5 // 다음 5개의 어셈블리 명령어 실행, 함수 내부로 들어가지 x

pwndbg> si 3 // 다음 3개의 어셈블리 명령어 실행, 함수 내부로 들어감

 


Examine

x를 이용하면 특정 주소에서 원하는 길이만큼의 데이터를 원하는 형식으로 인코딩하여 볼수 있음.

pwndbg> x/10gx $rsp //  rsp부터 80바이트를 8바이트씩 hex형식으로 출력

pwndbg> x/5i $rip // rip부터 5줄의 어셈블리 명령어 출력

pwndbg> x/s 0x400000 // 특정 주소의 문자열 출력

 


Telescope

특정 주소의 메모리 값들을 보여주는 것에서 그치지 않고, 메모리가 참조하고 있는 주소를 재귀적으로 탐색하여 값을 보여줌.

pwndbg> tele // 메모리 덤프 기능

 


Vmmap

가상 메모리의 레이아웃을 보여줌.

pwndbg> vmmap // 어떤 파일이 매핑 된 영역일 경우, 해당 파일의 경로까지 보여줌