디버거 사용법 정리
pwndbg
는gdb
의 플러그인
ELF
Excutable and Linkable Format의 약자이며 리눅스의 실행파일 형식임
헤더와 섹션들로 이루어져 있음
- 헤더에는 실행에 필요한 정보가 있음
- 섹션에는 컴파일된 기계어 코드, 프로그램 문자열등 데이터가 포함됨
EP
Entry Point의 약자
ELF 헤더의 필드에 존재, OS에서 ELF를 실행할때 이 값부터 프로그램을 실행함
readelf
명령어로 EP의 주소를 알 수 있음
start
gdb에서 EP부터 프로그램을 분석할 수 있게 해주는 명령어
►
문자가 가리키고 있는곳이 현재 rip
레지스터가 가지고 있는 값
context
pwndbg
에서 프로그램이 실행되고 있을때 주요 메모리들의 상태를 나타내주는것
4가지의 영역으로 구분됨
- REGISTER: 레지스터의 상태를 보여줌
- DISASM: 어셈블리어로 번역된 기계어 코드를 보여줌
- STACK: 현재 메모리상의 스택영역을 보여줌
- BACKTRACE: 현재 상태까지 호출된 함수들의 목록을 보여줌
breakpoint / continue
breakpoint set
b *함수명
함수 내의 코드에 breakpoint를 지정하려면 함수명+비트수
pwndbg> b *main
continue code
c
pwndbg> c
disassembly
gdb
에서 기본 지원하는 명령어임
disassembly 함수명
으로 해당 함수만 어셈블리어로 번역된 결과를 받아올 수 있음
pwndbg> u
사용하면 색도 입혀서 보여줌
ni / si / finish
- ni: next instruction
다음 코드 한 줄 실행시켜줌 다만 서브루틴 내로 들어가지는 않음
- si: step into
마찬가지로 다음 코드 한 줄 실행시키는데 서브루틴이라면 거기 내부로 들어감
- finish
해당 함수를 끝까지 실행시켜줌
si 같은걸로 들어갔다가 빠져나올때 주로 사용한다고 함
examine
특정 주소에서 지정한 만큼의 데이터를 지정한 데이터 형식으로 보여줌
gdb
기본명령이며 x
를 사용
x/[진법][데이터형식]
당연히 []
는 빼고 실행해야함괄호 없이 붙여쓰면 뭔가 보기 힘들었음 ㅎ..
Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal), t(binary), f(float), a(address), i(instruction), c(char), s(string) and z(hex, zero padded on the left). Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes).
pwndbg> x/5i $rsp
rsp
레지스터에 지정된 주소부터 명령어를 5줄 출력 머 이런식임
telescope
pwndbg
명령어, 특정 메모리 값들과 해당 메모리가 참조하고 있는 주소를 재귀적으로 탐색하여 보여줌
pwndbg> tele
vmmap
가상 메모리의 레이아웃을 보여줌.. 이라는데 잘 몰겠음
파일이 매핑된 영역일 경우 해당 파일의 경로까지 보여준다고 함
- 파일 매핑: 어떤 파일을 메모리에 적재하는것
gdb에 사용자가 직접 값을 입력할 수 없을때
python
인라인 코드를 사용하여 직접 데이터를 넘겨주면 됨
16진수 값을 넣어주거나 할때 사용하는듯
r
명령어 사용시 파라미터로 $()
의 괄호 안에 인라인 코드를 작성하면 됨
- 실행시 파라미터를 넘겨줄때
pwndbg> r $(python -c 'print "\xff"*100')
- 실행 후 입력값을 넘겨줄때
r
명령 입력시 <<<
쓴 뒤에 $()
에 코드 작성
pwndbg> r <<< $(python -c 'print "\xff"*100'
실행시 파라미터와 입력값 넘기는거 동시에 가능