일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- mysql
- Java
- MacOS
- for
- Pipelining
- html
- python
- DoM
- Class
- php
- javascript
- DS
- system
- instruction
- github
- XML
- architecture
- web
- while
- Algorithm
- control
- react
- DATAPATH
- data structure
- MIPS
- computer
- DB
- CSS
- function
- Linux
- Today
- Total
YYYEJI
[GDB] gdb 명령어 정리 본문
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 | 한 줄 씩 수행, 함수가 있으면 내부로 들어가 한 줄 씩 실행 |
수식의 값을 보여줌 | |
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 |