버그를 없애기 위해 사용하는 도구
리눅스의 대표적인 디버거 (여기서는 pwndbg 사용)
디버깅 시작
$gdb filename
진입점부터 프로그램 분석
pwndbg> start
REGISTER : 레지스터의 상태
DISASM : rip 부터 여러 줄에 걸쳐 디스어셈블된 결과 출력
STACK : rsp 부터 여러 줄에 걸쳐 스택의 값들을 출력
BACKTRACE : 현재 rip에 도달할 때까지 중첩되어 호출된 함수들을 출력
특정 주소에 중단점(breakpoint)을 설정하는 기능
pwndbg> b *main ; main 함수가 실행되는 시점에 중단점 설정
중단된 프로그램을 계속 실행시키는 기능
단순 실행
설정한 중단점이 없다면 프로그램이 끝까지 멈추지 않고 실행된다.
함수 이름을 인자로 전달하면 해당 함수가 반환될 때까지 전부 디스어셈블하여 결과 출력
gdb에서 기본적으로 제공하는 디스어셈블 명령어
디스어셈블된 코드를 가독성 좋게 출력
pwndbg에서 제공하는 디스어셈블 명령어
어셈블리 명령어를 한 줄 실행
- ni(next instruction) : 서브루틴의 내부로 들어가지 않음
- si(step into) : 서브루틴의 내부로 들어감 (함수 내부도 한 줄씩 실행)
- finish : 서브루틴 내부로 진입한 경우 함수의 끝까지 한번에 실행
특정 주소에서 원하는 길이만큼의 데이터를 원하는 형식으로 인코딩하여 출력
형식
o(octal)
x(hex)
d(decimal)
u(unsigned decimal)
t(binary)
f(float)
a(address)
i(instruction)
c(char)
s(string)
z(hex, zero padded on the left)
사이즈
b(byte)
h(halfword)
w(word)
g(giant, 8 bytes)
- rsp부터 80바이트를 8바이트씩 hex 형식으로 출력
→ x/10gx $rsp- rip부터 10줄의 어셈블리 명령어 출력
→ x/10i $rip- 특정 주소의 문자열 출력
→ x/s 0x400000
메모리 덤프 기능
특정 주소의 메모리 값들을 보여주고, 참조하고 있는 주소를 재귀적으로 탐색하여 값을 출력
가상 메모리의 레이아웃
어떤 파일이 매핑된 영역일 경우, 해당 파일의 경로까지 출력
파일 매핑 : 어떤 파일을 메모리에 적재하는 것
r $(python -c 'print "\xff"*100') <<< $(python -c 'print "dreamhack"')