1. gcc
์ฐ๋ถํฌ๋ฅผ ์ค์นํ๋ฉด ๋ณดํต gcc ์ปดํ์ผ๋ฌ๊ฐ ์ค์น๋์ด ์๋ค.
gcc๋ฅผ ์ ๋ ฅํด ๊ฐ๋จํ ์ค์น๋ฅผ ํ์ธํด ๋ณผ ์ ์๋ค.

์์ ๊ฐ์ ๋ฉ์์ง๊ฐ ๋ํ๋๋ฉด ์ค์น๋์ด ์๋ ๊ฒ์ด๋ค.
๋ง์ฝ ์ค์น๋์ด ์์ง ์๋ค๋ฉด, ์๋์ ์ฝ๋๋ก ์ค์นํด์ค๋ค.
gcc ์ค์น
$ sudo apt-get install gcc
gcc ๋ฒ์ ํ์ธ
$ gcc --version

์ปดํ์ผ ์ -m32 ์ต์ ์ผ๋ก 32๋นํธ ํ๋ก๊ทธ๋จ์ ์ปดํ์ผํ ์ ์๋ค.

๊ทธ๋ฌ๋ libc-header-start.h๊ฐ ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
$ sudo apt-get install libx32gcc-4.8-dev
์์ ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ฉด, ์ ์์ ์ผ๋ก ์ํ๋๋ค.
2. gdb & pwndbg
gdb ์ค์น
$ sudo apt-get install gdb
pwndbg ์ค์น
$ git clone https://github.com/pwndbg/pwndbg.git
$ cd pwndbg
$ ./setup.sh
๋์์์ pwndbg๊ฐ ์คํ์ด ๋๋์ง ํ์ธํด๋ณด์.
$ cd
$ gdb test.txt
์ฌ๊ธฐ๊น์ง ํ๋ฉด ์ ์์๋๋์ด์ผ ํ๋ค.
๊ทธ๋ฐ๋ฐ pwndbg ๋์ ๋ฆฌ๋ ์ค์ ๊ธฐ๋ณธ ๋๋ฒ๊ฑฐ๋ก ์คํ๋๋ค.
~/.gdbinit ์์ ๊ธฐ๋ณธ ๋๋ฒ๊ฑฐ ํ์ผ์ ์ญ์ ํ๋ค.
(ํน์ ๋ชจ๋ ์ง์ฐ๊ณ ์ฌ์ค์น)

์ด์ pwndbg๋ก ์คํ์ด ๋๋ค.
1. GDB
- ๋๋ฒ๊ฑฐ : ํ๋ก๊ทธ๋จ์ ๊ฒฐํจ(๋ฒ๊ทธ)๋ฅผ ์์ ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋๊ตฌ
GDB๊ฐ์ ๋๋ฒ๊ฑฐ์ ๋ชฉ์ ์ ํ๋ก๊ทธ๋จ ์ํ ์ค์ ๋ณด์ฌ์ฃผ๊ฑฐ๋ ํ๋ก๊ทธ๋จ์ด ์๋ชป ์คํ๋์์ ๋ ๊ทธ ํ๋ก๊ทธ๋จ ‘๋ด๋ถ์์’ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด๋ค. GDB๋ C, C++, Modula-2 ์ฝ๋์ ํ๋ก๊ทธ๋จ์ ๋๋ฒ๊ทธํ ์ ์๋ค. ์์์ gdb๋ก GDB๋ฅผ ์์ํ๋ฉด ์ข ๋ฃ ๋ช ๋ น quit ์ ๊น์ง๋ ํฐ๋ฏธ๋๋ก๋ถํฐ ๋ช ๋ น๋ผ์ธ์ ์ฝ์ด๋ค์ธ๋ค.
๋๋ฒ๊น
์ ํ๊ธฐ ์ํด์๋ –g ์ต์
์ ์ฃผ๊ณ ์ปดํ์ผ/๋งํฌ ํด์ผ ํ๋ค. ๋ง์ฝ ๋งํฌ๊ฐ libg.a๋ฅผ ์ฐพ์ ์ ์๋ค๊ณ ํ๋ฉด, /usr/lib/ligb.a๋ฅผ ๊ฐ๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ ํ์ผ์ ํน๋ณํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก์ ๋๋ฒ๊น
๊ฐ๋ฅํ C๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. libc ํจํค์ง์ ํฌํจ๋์ด ์๊ฑฐ๋ ๋๋ libc ์์ค ์ฝ๋๋ฅผ ๋ฐ์์ ์ปดํ์ผํ๋ฉด ํ์ผ์ด์๊ธด๋ค. /usr/lib/libc.a๋ฅผ /usr/lib/libg.a๋ก ๋งํฌ์์ผ๋ ๋๋ค.
1.1. ์ฝ์ดํ์ผ ๋ถ์ํ๊ธฐ
์ฝ์ดํ์ผ์ ์ถฉ๋ํ ๋น์ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ด๋ฏธ์ง๋ฅผ ๋คํํ ๊ฒ์ด๋ค. ์ฝ์ดํ์ผ์ gdb์ ํจ๊ป ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์ํ๋ฅผ ์กฐ์ฌํ๊ณ ์คํจ ์์ธ์ ๊ท๋ช
ํ ์ ์๋ค. ์ด๋ค ์๊ธฐ์น ์์ ์ผ์ด ๋ฐ์ํ์ฌ ๋น์ ์์ ์ธ ์ข
๋ฃ๊ฐ ๋ฐ์ํ ๋, ์ด์์ฒด๊ณ๋ ๋์คํฌ์ ์ฝ์ด ํ์ผ์ ๋จ๊ธด๋ค. ๋ฉ๋ชจ๋ฆฌ์ ๊ดํ ๋ฌธ์ ๋ Checker ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฐฉํ ์ ์๋ค. ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ fault๋ฅผ ์ผ์ผํค๋ ๊ฒฝ์ฐ์๋ ์ถฉ๋ํ๋ฉฐ ํ์ผ์ ๋คํํ๋ค. ์ฝ์ดํ์ผ์ ์ผ๋ฐ์ ์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ์คํ์ํจ ํ์ฌ ์์
๋๋ ํ ๋ฆฌ์ ์์ฑ๋์ง๋ง, ํ๋ก๊ทธ๋จ ๋ด์์ ์์
๋๋ ํ ๋ฆฌ๋ฅผ ๋ฐ๊พธ๋ ๊ฒฝ์ฐ๋ ์๋ค.
๋ณดํต ๋ฆฌ๋
์ค๋ ๋ถํ
์์ ์ฝ์ด ํ์ผ์ ๋ง๋ค์ง ์๋๋ก ์ธํ
๋์ด ์๋ค. ๋ฐ๋ผ์ ์ฝ์ด ํ์ผ์ ์์ฑํ๋ ค๊ณ ํ๋ค๋ฉด, ์
์ ๋ด์ฅ ๋ช
๋ น์ ์ฌ์ฉํ๋ค.
- C์ ํธํ ์(tcsh)์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
$ limit core unlimited
- ๋ณธ์๋ฅ(sh , bash , zsh , pdksh)์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
$ ulimit –c unlimited
- ์ฝ์ดํ์ผ์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
$ gdb program core
- ํ์ฌ ์ค์ ๊ฐ ํ์ธ
$ ulimte -a
1.2. ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ ๋๋ฒ๊น ํ๊ธฐ
gdb๋ ์ด๋ฏธ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ๋ ๋๋ฒ๊น ํ ์ ์๊ฒ ํด์ค๋ค. ํ๋ก์ธ์ค ์คํ์ ๊ฐ๋ก์ฑ๊ณ ์กฐ์ฌํ ๋ค ๋ค์ ์๋ ์ํ๋ก ์คํํ๋๋ก ํ ์ ์๋ค.
attach๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์คํ์ค์ธ ํ๋ก์ธ์์ gdb๋ฅผ ๋ถ์ธ๋ค. attach ๋ช ๋ น์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํ๋ก์ธ์ค์ ํด๋นํ๋ ์คํ ํ๋ก๊ทธ๋จ์ ํ๊ฐ๊ถ์ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
e.g. ํ๋ก์ธ์ค ID 254๋ฒ์ผ๋ก ์คํ ์ค์ธ pgmseq ํ๋ก๊ทธ๋จ
$ gdb pgmseq
$ attach 254
ํน์
$ gdb pgmseq 254
์ผ๋จ gdb๊ฐ ์คํ ์ค์ธ ํ๋ก์ธ์ค์ ๋ถ์ฐฉ๋๋ฉด, ํ๋ก๊ทธ๋จ์ ์ผ์ ์ค์ง์ํค๊ณ gdb๋ช
๋ น์ ์ฌ์ฉํ ์ ์๋๋ก ์ ์ด๊ถ์ ๊ฐ์ ธ์จ๋ค. break๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ง์ ์ ์ฌ์ฉํ ์ ์๊ณ ์ค์ง์ ์ ์ด๋ฅผ ๋๊น์ง ์คํํ๋๋ก continue ๋ช
๋ น์ ์ฌ์ฉํ ์ ์๋ค. detach๋ช
๋ น์ ์ฌ์ฉํ์ฌ gdb๋ฅผ ์คํ ์ค์ธ ํ๋ก์ธ์ค์์ ๋ถ๋ฆฌํ๋ค. ํ์์ ๋ฐ๋ผ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋ํ์ฌ attach๋ช
๋ น์ ์ฌ์ฉํ ์ ์๋ค.
2. gdb์์ํ๊ธฐ
% gdb
- gdb๋ฅผ ๋จผ์ ์คํ ํ file์ด๋ผ๋ ๋ช
๋ น์ผ๋ก program์ ๋ถ๋ฅธ๋ค.
% gdb program
- ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
% gdb program core
- ์ฝ์ดํ์ผ์ ์ฌ์ฉํ ๋ ๋์์ ์ธ์๋ก ์ค๋ค.
% gdb program 1234
- ์คํ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ๋๋ฒ๊ทธ ํ๋ ค๋ฉด ํ๋ก์ธ์ค ID๋ฅผ ๋ ๋ฒ์งธ ์ธ์๋ก ์ฃผ๋ฉด ๋๋ค. ์ด ๋ช
๋ น์ gdb๋ฅผ (‘1234’ ๋ ์ด๋ฆ์ ํ์ผ์ด ์๋ค๋ฉด) ํ๋ก์ธ์ค 1234์ ์ ์์ํจ๋ค.(gdb๋ coreํ์ผ์ ๋จผ์ ์ฐพ๋๋ค.)
์คํ์ ์ฐจ
% gcc –g test.c –o test
% gdb test
์ด ๋ช
๋ น์ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฉ์์ง๊ฐ ๋ํ๋๋ค.
| % gdb test GNU gdb 4.18 Copyright 1998 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are Welcome to change it and/or distribute copies of it under certain conditions. Type “show copying” to see the conditions. There is absolutely no warranty for GDB. Type “show warranty” for details. This GDB was configured as “i386-redhat-linux”... (gdb) |
3. ๋ช ๋ น์ด
| list | ํ์ฌ ์์น์์ ์์ค ํ์ผ์ ๋ด์ฉ์ 10์ค ๋ณด์ฌ์ค๋คlist 2, 15 : ์์ค ํ์ผ์2 ~ 15 ๊น์ง๋ฅผ ๋ณด์ฌ์ค๋ค. |
| run | ํ๋ก๊ทธ๋จ์ ์์ํ๋ค.(break๊ฐ ์๋ค๋ฉด break๊น์ง ์คํ)run arg : ์๋ก์ด ์ธ์๋ฅผ ๊ฐ์ง๊ณ ํ๋ก๊ทธ๋จ์ ์์ํ๋ค.arg๋ “*”๋ “[…]”๋ฅผ ํฌํจํ ์๋ ์๋ค. ์์ ์ฌ์ฉ๊น์ง๋ ํ์ฅ๋ ์ ์๋ค.“<”,“>” , “>>”๊ฐ์ ์ ์ถ๋ ฅ ๋ฐฉํฅ ์ฌ์ง์ ๊ธฐํธ๋ ๋ํ ํ์ฉ๋๋ค. |
| break | ํน์ ๋ผ์ธ์ด๋ ํจ์์ ์ ์ง์ ์ ์ค์ ํ๋ค.break function : ํ์ฌ ํ์ผ ์์ ํจ์ function์ ์ ์ง์ ์ ์ค์ ํ๋ค.break file:function : ํ์ผfile์์ function์ ์ ์ง์ ์ ์ค์ ํ๋ค.watch : ๊ฐ์์ ์ค์ (๊ฐ์์ ์ ์ด๋ค์ฌ๊ฑด์ด ์ผ์ด๋ ๋์๋ง ์๋ํ๋ค)until : ์คํ์ค line๊น์ง ์คํ |
| clear | ํน์ ๋ผ์ธ์ด๋ ํจ์์ ์๋ ์ ์ง์ ์ ์ญ์ ํ๋ค. |
| delete | ๋ช๋ช ์ ์ง์ ์ด๋ ์๋์ผ๋ก ์ถ๋ ฅ๋๋ ํํ์ ์ญ์ ํ๋ค. |
| next | ๋ค์ ํ์ ์ํํ๋ค. ์๋ธ๋ฃจํด์ ํธ์ถํ๋ฉด์ ๊ณ์ ์ํํ๋ค.ํธ์ถ์ด ๋ฐ์ํ์ง ์์ผ๋ฉด step์ ๊ฐ๋ค.next n : ์ด๋ฅผ n๋ฒ ์ํํ๋ผ๋ ์๋ฏธ |
| step | ํ ์ค์ฉ ์คํ ์ํจ๋ค. ํจ์๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉด ํจ์ ๋ด๋ถ๋ก ๋ค์ด๊ฐ์ ํ ์ค์ฉ ์คํ์ํจ๋ค. |
| print expr : ์์์ ๊ฐ์ ๋ณด์ฌ์ค๋ค. | |
| display | ํ์ฌ display๋ ๋ช ๋ น์ ๋ชฉ๋ก์ ๋ณด์ฌ์ค๋ค. |
| bt | ํ๋ก๊ทธ๋จ ์คํ์ ๋ณด์ฌ์ค๋ค. (backtrace) |
| kill | ๋๋ฒ๊น ์ค์ธ ํ๋ก๊ทธ๋จ์ ์คํ์ ์ทจ์ํ๋ค. |
| file | file program : ๋๋ฒ๊น ํ ํ๋ก๊ทธ๋จ์ผ๋ก์ ํ์ผ์ ์ฌ์ฉํ๋ค. |
| cont | continue : ํ์ฌ ์์น์์ ํ๋ก๊ทธ๋จ์ ๊ณ์ ์คํํ๋ค. |
| help | ๋ช ๋ น์ ๊ดํ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๊ฑฐ๋ ์ผ๋ฐ์ ์ธ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋ค. |
| quit | gdb์์ ๋น ์ ธ๋๊ฐ๋ค. |
4. ์ค์ต
4.1 ์์ 1
% vi test.c
| 1 #include <stdio.h> 2 3 main() 4 { 5 int i; 6 double j; 7 /*๋ค์์i/2+i์ ๊ฐ์ ์ถ๋ ฅํ๋ ๋ฌธ์ด๋ค. 8 i๊ฐ1์ด๋ฉด j๋1.5๊ฐ ๋์ด์ผ ํ์ง๋ง ์ค์ ๋ ๊ทธ๋ ์ง ์๋ค.*/ 9 for( i=0; i<5 ; i++){ 10 j=i/2+i; 11 printf(“j is %f \n”,j); 12 } 13 } |
% gcc –g test.c –o test
% test
์คํ์ด ๋์ง ์์ผ๋ฉด mv test a.out์ผ๋ก ํ์ฌ a.out์ ์คํ์ํจ๋ค. ์คํ์ ์ํค๋ฉด ์ํ๋ ๋ต์ด ์๋๋ค. ๊ทธ๋ฌ๋ฉด gdb๋ฅผ ํด๋ณด์.
% gdb a.out
(gdb) list // list๋ ์์ค ๋ด์ฉ์ 10์ค์ฉ ๋ณด์ฌ์ค๋ค.
1 #include <stdio.h>
2
3 main()
4 {
5 int i;
6 double j;
7 /*๋ค์์ i/2+i์ ๊ฐ์ ์ถ๋ ฅํ๋ ๋ฌธ์ด๋ค.
8 i๊ฐ1์ด๋ฉด j๋1.5๊ฐ ๋์ด์ผ ํ์ง๋ง ์ค์ ๋ ๊ทธ๋ ์ง ์๋ค.*/
9 ( i=0; i<5 ; i++){
j=i/2+i;
(gdb) b 9 // break 9 : for ๋ฌธ์ ์ด์์ด ์๋ค๊ณ ํ๋จํ์ฌ line 9์ breakpoint๋ฅผ ์ก๋๋ค.
Breakpoint 1 at 0x80483d6: file test.c, line 9.
(gdb) r // run : breakpoint๊น์ง ์คํ๋๋ค.
Starting program: /home/pllab/chowing/gdb/a.out
Breakpoint 1, main () at test.c:9
9 for( i=0; i<5 ; i++){
(gdb) s // step : ํ์ค ์คํ์ํจ๋ค.
j=i/2+i;
(gdb) s
11 printf(“j is %f \n”,j);
(gdb) p j // print j : j์ ๊ฐ์ ๋ณธ๋ค.
$2 = 0
(gdb) n
j is 0.000000
for( i=0; i<5 ; i++){
(gdb) display i
(gdb) display j
(gdb) n
11 printf(“j is %f \n”,j);
2: j = 1
1: i = 1
// 10 line์์ ์คํ ํ i=1์ผ ๋, j=1์ด๋ฏ๋ก 10 line์์ ์๋ชป๋ ๊ฒ์ ์ ์ ์๋ค.// 10 line์ j = (double) i/2 + i; ๋ก ๊ณ ์น๋ค.
(gdb) quit
4.2 ์์ 2
% vi hab.c
| 1 #include <stdio.h> 2 3 int hab(int x, int y); 4 5 main(void) 6 { 7 int a, b,dab; 8 printf(“์ ์a, b๋ฅผ ์ ๋ ฅํ์์ค”); 9 scanf(“%d %d”,&a,&b); 10 dab = hab(a,b); 11 printf(“\n%d + %d = %d \n”,a,b,dab); 12 } 13 int hab(int x, int y) 14 { 15 return (x + y); 16 } |
// ์ด ํ๋ก๊ทธ๋จ์ ์ด์ ์๋ค. ์คํ์ ๋ณด๊ธฐ ์ํ ๊ฒ์ด๋ค.// ์ฌ๋ฌ ๊ณณ์์ ํธ์ถ๋๋ ํจ์ ์์์ ์ถฉ๋์ด ์ผ์ด๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ณด์. ์ด ๋๋ ํจ์๊ฐ ์ด๋๋ก๋ถํฐ ํธ์ถ๋์๋์ง ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ํฉ์์ ์ถฉ๋์ด ์ผ์ด๋ฌ๋์ง ํ์
ํ๊ณ ์ ํ ๊ฒ์ด๋ค.backtrace (bt) ๋ช
๋ น์ ์ด์ฉํ๋ฉด ์ถฉ๋์ด ์ผ์ด๋ ์์ ์์ ํ๋ก๊ทธ๋จ์ ํ์ฌ ํธ์ถ ์คํ(call stack) ์ํ๋ฅผ ๋ณผ ์ ์๋ค. ํธ์ถ ์คํ์ ํ์ฌ ํจ์๊น์ง ์ด๋ฅด๋ ํธ์ถ ๋ชฉ๋ก์ด๋ค. ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ๋ณด๊ด๋ ๋ ์ง์คํฐ ๊ฐ, ํจ์ ์ ๋ฌ ์ธ์, ์ง์ญ ๋ณ์ ๋ฑ์ ์๋ฃ๋ฅผ ์คํ์ pushํ๋ค. ์ด๋ ๊ฒ ํด์ ๊ฐ ํจ์๋ค์ ์คํ์์ ์ผ์ ๊ณต๊ฐ์ ์ฐจ์งํ๋ค. ํน์ ํจ์์ ๋ํ์ฌ ์คํ์์ ์ฌ์ฉ๋๊ณ ์๋ ๋ฉ๋ก๋ฆฌ ๋ถ๋ถ์ ์คํํ๋ ์(frame)์ด๋ผ ๋ถ๋ฅด๋ฉฐ ํธ์ถ ์คํ์ ์ด๋ฌํ ์คํ ํ๋ ์์ ์์๋๋ก ์ ๋ ฌํ ๋ชฉ๋ก์ด๋ค.
% gdb hab
(gdb) b 10 Breakpoint 2 at 0x8048428: file hab.c, line 10.
(gdb) r
Starting program: /home/pllab/chowing/gdb/hab
์ ์a, b๋ฅผ ์
๋ ฅํ์์ค3 4
breakpoint 2, main () at hab.c:10
10 dab = hab(a,b);
(gdb) bt // ํ์ฌ ์คํ์ main์ด ์๋ค.
#0 main () at hab.c:10
(gdb) s
hab (x=3, y=4) at hab.c:15
15 return (x + y);
(gdb) bt // ์ง๊ธ์ ์คํ์ hab์ด ์๋ค.
#0 hab (x=3, y=4) at hab.c:15
#1 0x8048435 in main () at hab.c:10
(gdb) frame 0 // hab์ ์ํ๋ฅผ ์ ๊ฒํ๊ธฐ ์ํด์ ์คํ ํ๋ ์0๋ฒ์ผ๋ก ์ด๋
#0 hab (x=3, y=4) at hab.c:15
15 return (x + y);
(gdb) up // hab์ด ์ด๋ป๊ฒ ํธ์ถ๋์๋๊ฐ๋ฅผ ๋ณด๊ธฐ ์ํ์ฌ ์์ ์คํํ๋ ์์ผ๋ก ์ด๋
#1 0x8048435 in main () at hab.c:10
dab = hab(a,b);
(gdb) finish
(gdb) info program // ํ๋ก๊ทธ๋จ์ ์คํ ์ํ๋ฅผ ๋ณด์ฌ ์ค๋ค.
Using the running image of child Pid 12909.
Program stopped at 0x804843d.
It stopped after being stepped.
(gdb) info locals // ํ์ฌ ํจ์ ๋ด์์ ๋ชจ๋ ์ง์ญ ๋ณ์ ์ด๋ฆ๊ณผ ๊ฐ์ ์ถ๋ ฅํ๋ค.
a = 3
b = 4
dab = 7
(gdb) info variables // ์์คํ์ผ ์์๋๋ก ํ๋ก๊ทธ๋จ ๋ด์ ์๋ ค์ ธ ์๋ ๋ชจ๋ ๋ณ์๋ฅผ ์ถ๋ ฅํ๋ค.
(gdb) info address a // ์ด๋ค ๋ณ์๊ฐ ์ด๋์ ์ ์ฅ๋์ด ์๋์ง์ ๋ํ์ฌ ์๋ ค ์ค๋ค.
Symbol “a” is a local variable at frame offset -4.
// a๊ฐ ์คํํ๋ ์ ๊ผญ๋๊ธฐ๋ก๋ถํฐ4๋ฐ์ดํธ ์๋์ ๋์ฌ ์๋ค๋ ๋ป์ด๋ค.(gdb) info frame // ํ์ฌ ํ๋ ์ ์ ๋ณด๋ฅผ ๋ณด์ฌ ์ค๋ค.
Stack level 0, frame at 0xbffff848:
eip = 0x804843d in main (hab.c:11); saved eip 0x400301eb
source language c.
Arglist at 0xbffff848, args:
Locals at 0xbffff848, Previous frame’s sp is 0x0
Saved registers:
ebp at 0xbffff848, eip at 0xbffff84c
4.3 ์์ 3
% vi core.c
| 1 #include <stdio.h> 2 3 main() 4 { 5 char *bug = NULL; 6 7 strcpy(bug,“debug”); 8 printf(“bug is %s \n”,bug); 9 10 return; 11 } 12 |
% coredebug
Segmentation fault
// core ํ์ผ ์์ฑ
% gdb coredebug
(gdb) b 7
Breakpoint 1, main () at core.c:7
7 strcpy(bug,”debug”);
(gdb) p bug
$1 = 0x0 // gdb ์์0x0๋ null์ด๋ค. ์ฆ ๋ฒ์ง๊ฐ ์๋ค.
(gdb) s
Program received signal SIGSEGV, Segmentation fault.
0x40075434 in ?? ()
// strcpy์์ segmentation fault๊ฐ ๋ฐ์ํ ๊ฒ์ ์ ์ ์๋ค.// bug์ ๋ฒ์ง๋ฅผ ํ ๋นํ๋ฉด ๋๋ค.
% gdb corebug core // coreํ์ผ์ ์ด์ฉํ๋ฉด bug์ ๋ณด๊ฐ ๋์จ๋ค.
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “i386-redhat-linux”...
warning: core file may not match specified executable file.
Core was generated by ‘a.out’.
Program terminated with signal 11, ์ธ๊ทธ๋ฉํ
์ด์
์ค๋ฅ.
Reading symbols from /lib/libc.so.6...done.
Reading symbols from /lib/ld-linux.so.2...done.
#0 strcpy (dest=0x0, src=0x8048490 “debug”) at ../sysdeps/generic/strcpy.c:38
../sysdeps/generic/strcpy.c: ๊ทธ๋ฐ ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๊ฐ ์์. gdb๋ signal 11 ๋ฒ๊ณผ ํจ๊ป ์ฝ์ด ํ์ผ์ด ์์ฑ๋์์์ ์๋ ค ์ค๋ค. ์ฌ๊ธฐ์๋ ํ๊ฐ๋ฐ์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฝ๊ธฐ, ์ฐ๊ธฐ๋ฅผ ์๋ํ๊ธฐ ๋๋ฌธ์ ์ปค๋์ด ํ๋ก์ธ์ค์๊ฒ signal 11์ ๋ณด๋๋ค.์ด ์๊ทธ๋๋ก ์ธํด ํ๋ก์ธ์ค๋ ์ข
๋ฃํ๋ฉด์ ์ฝ์ด ํ์ผ์ ๋คํํ๋ค.
4. ๊ธฐํ
Breakpoint
์ค์ง์ ์ ์กฐ๊ฑด์ ์ผ๋ก ์ค์ ํ ์ ์๋ค. ์ฆ, ์ด๋ค ๋์์ด ์ฐธ์ผ ๋๋ง ์๋ํ๋๋ก ํ ์ ์๋ค.
ex) break 184 if (stace == 0) info break๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์ค์ง์ ๊ณผ ๊ฐ์์ ๋ชฉ๋ก๊ณผ ๊ทธ ์ํ๋ ๋ณด์ฌ์ค๋ค.
disable์ ์ฌ์ฉํ์ฌ ์๋๋ถ๋ฅ์ผ๋ก ํ ์ ์๊ณ , enable์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฅํ๊ฒ ํ ์๋ ์๋ค.
์ธ์คํธ๋ญ์
๋ ๋ฒจ ๋๋ฒ๊น
gdb๋ฅผ ํตํด ์ธ์คํธ๋ญ์
๋ ๋ฒจ์ ๋๋ฒ๊น
์ ํ ์ ์์ผ๋ฏ๋ก ํ๋ก๊ทธ๋จ์ ๋งค์ฐ ๊น์ ๋ด๋ถ๊น์ง ์กฐ์ฌํ ์ ์๋ค.
(gdb) disass play
playํจ์์ ๋ํ ๋์ค์ด์ ๋ธ๋ฆฌ
(gdb) display/ i $pc
ํ์ฌ์ ์ธ์คํธ๋ญ์
์ ๋ณด์ฌ์ค๋ค. $pc๋ gdb๋ด๋ถ ๋ณ์๋ก์ ํ์ฌ ์ธ์คํธ๋ญ์
์ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋ ํ๋ก๊ทธ๋จ ์นด์ดํฐ์ด๋ค.
GDB์ ๋ํ ๋งค๋ด์ผ
http://kkucc.konkuk.ac.kr/~kipal/html/gdb-man.html
http://pl.changwon.ac.kr/~chowing/gdb_man.html
์ฐธ๊ณ
'๐ ๋ณด์ยท์ทจ์ฝ์ > ๐ธ์์คํ ยท์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [dreamhack] System Hackig Introduction (0) | 2023.07.08 |
|---|---|
| [dreamhack] pwnable.kr bof (0) | 2022.08.21 |
| Set-UID ์ ๋ฆฌ (0) | 2022.08.21 |
| [dreamhack] pwnable fd (0) | 2022.08.14 |
| buffer overflow์ ์ดํด (0) | 2022.08.14 |