Security/리버싱

GDB 사용법

이만석 2017. 11. 27. 20:35

- GDB 

GDB(GNU debugger) 는 GNU 소프트웨어 시스템을 위한 표준 debugger 이다. 

C, C++, 포트란을 비롯한 수많은 프로그래밍 언어를 디버깅하도록 도와주는 이식성 높은 GNU debugger이다.


- 실행 방법

gdb [프로그램명]

gdb [프로그램명] [core파일명]

gdb [프로그램명] [실행중인 프로세스 pid]


- 종료 방법

q (quit_

Ctrl + d


- 소스 보기 

( gdb 실행시 소스 폴더에서 구동해야 가능함 ) 

l  

main 함수를 기점으로 소스 출력 

l 10 

10행을 기준으로 출력 

l func 

func 함수의 소스를 출력 

l - 

출력 된 이전 행을 출력 

l file.c:func 

file.c의 func 함수 출력 

l file.c:10 file.c 

파일의 10행을 기준으로 출력 


- 브레이크 포인트

( 프로그램을 브레이크 포인트에 멈춰서 그 때의 상황을 파악하면서 확인할 때 사용 )

 b func

 func 함수의 시작 부분에 브레이크 포인트 설정 

b 10 

10행에 브레이크 포인트 설정 

b file.c:func

file.c 파일의 func 함수에 브레이크 포인트 설정

b file.c:10 file.c

파일의 10행에 브레이크 포인트 설정 

b +2 

현재 행에서 2개행 이후 지점에 브레이크 포인트 설정 

b -2  

현재 행에서 2개행 이전 지점에 브레이크 포인트 설정 

b *0x8049000 

 0x8049000 주소에 브레이크 포인트 설정 

 b 10 if var == 0 

10행에 브레이크 포인트를 설정하되, var 변수 값이 0일 때 작동 

 tb

임시 중단점을 사용하는 것으로 한번만 설정되며, 그 이후엔 삭제된다. 


 disable 2

고유번호 2번인 브레이크 포인트 비활성화 

enable 2  

고유번호 2번인 브레이크 포인트 활성화 



- 프로그램 실행, 종료 ( run kill )

r 

프로그램 수행( 재시작 ) 

r arg1 arg2 

arg1과 arg2를 인자로 프로그램 실행 

프로그램 수행 종료 


- 역추적 하기

 bt

오류가 발생한 함수를 역으로 찾아간다. 


- 디버깅 하기

 s

현재 출력된 행을 수행하고 멈추지만, 함수의 경우 함수의 내부로 들어가 수행 

s 5 

s를 5번 입력한 것과 동일 

n 

현재 행을 수행하고 멈추지만, 함수의 경우 함수를 수행하고 넘어간다. 

n 5 

n을 5번 입력한 것과 동일 

다음 브레이크 포인트를 만날때 까지 계속 수행한다. 

u

for 문에서 빠져나와서 다음 브레이크 포인트까지 수행한다.  

finish 

현재 함수를 수행하지 않고 빠져나감

return 

현재 함수를 수행하지 않고 빠져나감

return 123 

현재 함수를 수행하지 않고 빠져나감, 단, 리턴값은 123 

si 

현재의 익스트럭션을 수행, 함수 호출 시 내부로 들어간다.  

ni 

현재의 인스트럭션을 수행, 함수 호출 시 내부로 들어가지 않는다. 


- 변수 정보 보기

 info locals

현재 상태에서 어떤 지역변수들이 있으며, 값은 어떠한지를 알 수 있다.  

info variables 

현재 상태에서의 전역변수 리스트를 확인 할 수 있다.  

p lval 

lval 값을 확인한다.  

p func 

func 함수의 주소값을 확인한다.  

p pt 

pt가 구조체라면 구조체의 주소를 확인한다. 

p *pt 

*pt가 구조체라면 구조체의 값을 확인한다.  

p **pt 

**pt가 구조체라면 구조체의 값을 확인한다. 

info registers 

레지스트 값 전체를 한번에 확인한다.  


- 중복된 변수명이 있는 경우 특정 변수를 지정해서 출력

 p 'main.c'::var 

main.c 파일에 있는 전역변수인 var 변수의 값을 출력 

p hello::var 

hello 함수에 포함된 static 변수인 var 변수의 값 출력  


- 출력명령 요약

 p [변수명]

변수 값을 출력 

p [함수명] 

함수의 주소를 출력 

p/[출력형식] [변수명] 

변수 값을 출력 형식으로 출력 

p '[파일명]'::[변수명] 

파일명에 있는 전역변수 값을 출력 

p [함수명]::[변수명] 

함수에 있는 변수 값을 출력 

p [변수명]@[배열크기] 

변수의 내용을 변수 배열의 크기 형태로 출력 


- 스택 프레임 관련 명령

 frame [N]

n번 스택 프레임으로 변경 

up 

상위 프레임으로 이동 

up [N] 

n번 상위 스택 프레임으로 이동 

down 

하위 프레임으로 이동 

down [N] 

n번 하위 스택 프레임으로 이동 

info frame 

현재 스택 프레임 정보를 출력 

info args 

현재 스택 프레임의 함수가 호출될 때 인자를 출력 

info locals 

현재 스택 프레임의 함수내의 지역변수를 출력

info catch 

현재 스택 프레임의 함수내의 예외 핸들러를 출력 


- 메모리 상태 검사

 x/[범위] [출력형식] [볌위의 단위] : 메모리의 특정 값들을 확인 할 수 있다. 


출력형식

 x/10 main

main 함수 시작부터 40바이트를 출력한다.  

x/10t main 

2진수로 출력 

x/10o main 

8진수로 출력 

x/10d main 

부호가 있는 10진수로 출력 (int) 

x/10u main 

부호가 없는 10진수로 출력 (unsigned int)

x/10x main 

16진수로 출력 

x/10c main 

최초 1바이트 값을 문자형으로 출력 

x/10f main 

부동 소수점 값 형식으로 출력 

x/10a main 

가장 가까운 심볼의 오프셋을 출력 

x/10s main 

문자열로 출력 

x/10i main 

어셈블리 형식으로 출력 


범위의 단위

 x/10b main

byte 1바이트 단위 - 10바이트 출력 

x/10h main 

halfword 2바이트 단위 - 20바이트 출력 

x/10w main 

word 4 바이트 단위 - 40바이트 출력 

x/10g main 

giant word 8바이트 단위 - 80바이트 출력 


- 디스어셈블링

어셈블리 코드를 좀 보편적으로 보기 위한 명령어

disas func : func 함수 어셈블리 코드 보기


- 함수 호출

call func(arg1, arg2) :  특정 함수 func를 arg1, arg2 파라미터를 포함하여 호출하고, 반환값을 출력


- 점프 

 jump *0x0848321 

해당 주소로 무조건 분기하여 인스트럭션 수행 

jump 10 

무조건 10행으로 분기하여 수행 

jump func 

func 함수로 무조건 분기하여 수행 


- 시그널 전송

info signals : 보낼 수 있는 시그널의 종류를 확인 할 수 있다. 

signal SIGKILL : 디버깅 대상의 프로세스에게 KILL 시그널을 보낼 수 있다. 


- 메모리 특정 영역에 값을 설정

set {타입} [주소] = [값] : p 명령 대신에 set을 통해 메모리의 특정 주소에 저장하는 것이 더 일반적이다. 

set {int}0x8048300 = 100 : 해당 주소에 100의 값을 입력