간단한 .c 파일을 예제로 설명하겠다.
gcc 로 컴파일 한다.
gdb 명령어
다른 블로그에 좋은글이 많으니까 여기서는 자주 쓰는 것만 조금 정리할게요
r (run) : 바이너리를 실행한다. break point 가 없으면 끝까지 실행되고 종료된다
c (continue) : r 로 시작한 다음, break point 에서 멈추면 그 다음부터는 c 로 실행해야 한다. r 누르면 재시작
b *[주소 or 함수이름] (breakpoint) : 지정한 주소에 break point 를 건다.
b *0x401000
b *main
b *main+34
주로 이런식으로 사용
info b : break point 리스트를 보여준다.
del [숫자] : break point 리스트에 고유번호로 break point 를 없앨 수 있다.
x/gx [주소] | x/wx [주소] | x/s [주소] : 16진수로 주소에 있는 값을 각각 8바이트, 4바이트 그리고 (char*) 로 참조한 주소의 문자열로 출력한다.
main 함수로 찾아가는 방법은
start
b *main
r
크게 2가지가 있습니다.
start 를 입력하면 main 함수로 가집니다. 하지만 <start+0> 에 도착할 때도 있는데,
그 때는 밑의 명령어로 main 에 브포걸고 실행하면 됩니다.
file 명령어로 바이너리를 확인할 수 있는데, 마지막에 not stripped 라고 뜨면,
심볼이 깨지지않아 위에 b *main 처럼 함수이름으로 주소를 사용할 수 있습니다.
하지만 strip 명령어로 stripped 된 바이너리를 gdb 로 열어보면
이렇게 main함수가 뜨지 않습니다.
start 를 입력해도 이상한 곳에 와있고요.
그렇다면 이 상태에서
b *__libc_start_main
c
b *$rdi
c
차례로 입력하면 main 함수를 만날 수 있습니다
__libc_start_main 의 첫 번째 인자값은 main 의 주소이기 때문입니다.