본문 바로가기
Reversing

[Reversing] gdb debugging, no-symbol debugging, 실행 하는 법

by snwo 2021. 4. 9.

간단한 .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 의 주소이기 때문입니다.