디버깅 시작 gdb [실행파일명]
-ex : gdb debugee
readelf
로 확인할 수 있음.gdb의 start
명령어는 진입점부터 프로그램을 분석할 수 있게 해주는 명령어다.
b *func
-> func 함수에 중단점c
info breakpoint
로 리스트 확인 후, 해당 breakpoint의 number를 delete 명령 인수로 입력
delete 2
r
start
와 차이점?
start는 자동으로 중단점이 설정되었다면
run은 중단점이 없으면 중단없이 쭉 실행됨.
ex disassembly main
u, nearpc, pdisassemble
: 디스어셈블된 코드를 가독성 좋게 출력해줌.
중단점에서 한줄씩 보기!
ni
: next instruction
si
: step into
만약 call 등을 통해 서브루틴을 호출하는 경우
ni
는 서브루틴의 내부로 들어가지 않지만,
si
는 내부로 들어감!
step into 중에 함수 이제 다 봤고, 해당 서브루틴 관찰을 끝내고 싶다면 finish
를 통해 함수를 끝낼 수 있다.
x를 이용하면
특정주소에서 원하는 길이만큼의 데이터를 원하는 형시으로 인코딩하여 볼 수 있다.
원하는 형식의 인코딩
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)
ex
rsp부터 80바이트를 8바이트씩 hex형식으로 출력
x/10gx $rsp
ex
rip부터 5줄의 어셈블리 명령어 출력
x/5i $rip
ex
특정주소의 문자열 출력
x/s 0x400000
특정 주소의 메모리 값들을 보여주는 것에서 그치지 않고, 메모리가 참조하고 있는 주소를 재귀적으로 탐색하여 값을 보여준다.
어떤 파일이 매핑된 영역일 경우, 해당 파일의 경로까지 보여줌.
gdb를 통해 디버깅할 때 직접 입력할 수 없는 경우
파이썬으로 입력값을 생성하고 사용하여야 함.
ex : r $(python -c 'print "\xff"*100')
print함수를 통해 출력한 값을 run 명령어의 인자로 전달하는 명령어
입력값으로 전달하기 위해서는 <<<
문자를 사용
ex : r $(python -c 'print "\xff"*100') <<< $(python -c 'print "zzoni"')
argv[1]에 임의의 값을 전달하고, 값을 입력하는 명령어
출처 : dreamhack