YYYEJI

[GDB] gdb 명령어 정리 본문

Security

[GDB] gdb 명령어 정리

YEJI ⍢ 2022. 7. 19. 12:48
728x90

gdb는 디버깅(Debugging)을 목적으로 프로그램 내부의 상황을 알 수 있게 해주는 디버거(Debugger)입니다.

 

우선 gdb를 실습하기 전에 도커를 다운 받아주세요!

 

[Docker] MacOS에서 Docker 시작하기

Docker(도커)란? 컨테이너 기반의 오프소스 가상화 플랫폼이다. Image(이미지)란? 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것이다.  상태값을 가지지 않고 변하지 않는다. Container(

yyyeji.tistory.com

도커가 다운이 되었다면 바로 시작하도록 하겠습니다!

 

 

아래 명령어를 통해 도커 계정에 로그인합니다.

$ docker run -it —name bufferoverflow ubuntu:20.04 /bin/bash

 

아래 명령어를 하나씩 입력해서 하나씩 다운받아 주시면 됩니다.

$ apt-get update && \apt-get -y install sudo
$ apt-get install gdb
$ apt-get install gcc-multilib g++-multilib
$ apt-get install checksec
$ sysctl -w kernel.randomize_va_space=0

 

새로운 파일을 하나 만들어서 아래 코드를 복붙해주세요. (sum.c)

#include <stdio.h>

void sum(int a, int b) { 
	printf("sum : %d", a + b); 
} 

int main(void) { 
	int num1, num2; 

	scanf("%d %d", &num1, &num2); 	
	sum(num1, num2) ;
	
	return 0; 
}

 

코드를 복붙했다면 저장하고 나와서 터미널에 아래 코드를 작성해주세요. (아래 코드는 컴파일하는 코드입니다.)

$ gcc -m32 -mpreferred-stack-boundary=2 -fno-stack-protector -z execstack -no-pie -fno-pic -o sum sum.c

위에 코드를 작성하셨다면 sum이라는 실행 파일이 생겼을 것입니다. (ls로 확인)

 

어셈블리어에는 intel 방식과 AT&T방식이 있는데 intel 방식으로 사용하기 위해 아래 코드를 작성해줍니다. (인텔 방식이 좀 더 쉬워요!)

$ echo "set diasssembly-flavor intel" >> ~/.gdbinit

( ./.gdbinit은 숨김 파일이기 때문에 ls -al로 확인이 가능합니다. )

 

 

gdb를 본격적으로 들어가보겠습니다.

 

아래 코드를 작성하시면 gdb mode로 들어가게 됩니다.

$ gdb sum                // gdb [실행파일이름]

gdb를 사용할 때 -q 옵션을 같이 넣어주면  gdb의 시작 문구가 뜨지 않습니다.

 

아래 명령은 gdb를 종료 시켜줍니다.

$ q                     // quit

 

다음 명령은 break point에 관한 명령입니다.

break point는 코드를 한 줄씩 보다가 의도적으로 잠시 또는 아예 멈추게 하는 구간을 가르킵니다.

$ b main

 

사용자가 지정한 break point를 확인하고 싶을 땐 

$ i b                  // info break point

로 확인하면 됩니다.

 

주소로 break point를 걸고 싶을 땐 아래 명령어를 사용하면 됩니다. 

$ b *0x080484a2         // b *address

 

코트의 상태를 보고 싶을 땐 disassemble 명령어를 작성해 주면 됩니다.

$ disas sum            //disas [실행파일이름]

 

다음 명령어는 next instruction(disas main 한 줄 한 줄을 뜻 함)으로 지금 보고 있는 코드에서 다음 코드로 넘어갈 때 사용합니다.

$ ni

ni 명령어를 한 번 사용했다면 그 뒤로는 Enter를 통해 코드를 넘어갈 수 있습니다.

 

코드를 넘어가다가 함수가 등장하면 아래 명령어를 통해 함수 내부로 들어갈 수도 있습니다.

$ si

 

< gdb 명령어 정리 > 

list     현재 위치에서 소스파일 보여줌
run    프로그램 시작
info    정보 알려줌
info break    break point의 정보를 알려줌
info locals    local variable의 현재 값 모두 출력
break    특정라인이나 함수에 break point 설정
watch   breakpoint를 변수에 걸어 변수의 값이 변경될 때 break 됨
clear   breakpoint 삭제
bt   현재 프로그램의 스택을 보여줌(backtrace), history를 보여줌
display   현재 display된 명령의 목록을 보여줌
next   현재 파일에서 다음행을 수행
step   한 줄 씩 수행, 함수가 있으면 내부로 들어가 한 줄 씩 실행
print   수식의 값을 보여줌
kill   현재 실행중인 프로그램의 실행을 취소
cont   continue, 현재 위치에서 프로그램을 계속 실행
quit   gdb 종료

 

 

 

 

◡̈