일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- MacOS
- php
- github
- function
- DATAPATH
- for
- DB
- DS
- python
- control
- Java
- react
- data structure
- MIPS
- architecture
- Algorithm
- XML
- computer
- instruction
- while
- system
- html
- CSS
- web
- Pipelining
- DoM
- Class
- mysql
- javascript
- Linux
- Today
- Total
YYYEJI
[GDB] gdb 명령어 정리 본문
gdb는 디버깅(Debugging)을 목적으로 프로그램 내부의 상황을 알 수 있게 해주는 디버거(Debugger)입니다.
우선 gdb를 실습하기 전에 도커를 다운 받아주세요!
도커가 다운이 되었다면 바로 시작하도록 하겠습니다!
아래 명령어를 통해 도커 계정에 로그인합니다.
$ 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 | 한 줄 씩 수행, 함수가 있으면 내부로 들어가 한 줄 씩 실행 |
수식의 값을 보여줌 | |
kill | 현재 실행중인 프로그램의 실행을 취소 |
cont | continue, 현재 위치에서 프로그램을 계속 실행 |
quit | gdb 종료 |
◡̈
'Security' 카테고리의 다른 글
[DVWA] 웹 모의해킹 실습 (Stored XSS) (0) | 2022.07.30 |
---|---|
[DVWA] 웹 모의해킹 실습 (Blind SQL Injection) (0) | 2022.07.29 |
[DVWA] 웹 모의해킹 실습 (Command Injection, File Upload) (0) | 2022.07.28 |
[DVWA] 웹 모의해킹 실습 (SQL Injection, XSS) (0) | 2022.07.27 |
[XAMPP] XAMPP 다운로드하기 (0) | 2022.07.26 |