fork/exec 설정

peda와 cgdb를 사용할 것.


```bash

set env LD_PRELOAD=./libc.so.6

set {void*}0x80dfff7a = 0xff

set $rdx=0x98583

```

```bash

x/4x &main_arena

x/4x &__malloc_hook

find [/size-char] [/max-count] start_addr, +len, val1 [, val2, ...]

find [/size-char] [/max-count] start_addr, end_addr, val1 [, val2, ...]

```

```bash

watch $eax        //eax가 변경될 때 마다 중단

d [num]    // bp 지우는 것과 똑같다.

display $eax      //중단될 때 마다 eax값 출력

```

```bash

p [수식 또는 변수]       //변수의 value 출력. 수식 입력 시 계산기 처럼 사용하기 좋음.

p/d 16


(gdb) r < <(python -c 'print "123\x0045\x0167"')    // stdin

bt                // backtrace. 죽기 직전 호출했던 call stack 확인.

!                 // vi처럼 임시 shell 실행

```


Useful

```bash

u                       //현재 반복문을 빠져나감

finish                  //현재 함수를 수행하고 return

return [retval]         //현재 함수를 수행하지 않고 return. retval을 지정할 수 있음.


call [func(arg...)]                //함수 호출

jump [*addr | linenum | func]      //강제 분기

```


show

```bash

info reg [register]

info b                  //bp 출력

info args               //arguments 출력

info locals             //지역변수 출력

info variable           //전역변수 출력

show env                //env는 info가 아니라 show다.


disas [func] [func+n 또는 주소] //그 주소까지만 disas 출력

print funcname          //함수 주소 확인. run하고 수행시 GOT 확인 가능.

```


break

```bash

b *0xaddr

b *func [+n]            // n은 func로부터의 상대위치

b +n                    // 현재 행 기준 +2행에 bp. -도 동일.

b 10 if var ==0         // 조건부 break


cl                      //bp 지우기. b와 동일한 옵션으로 사용 ??? d가 대체.

d idx                   //idx bp 삭제.

tb                      //일회용 break. b와 동일한 옵션으로 사용

```

```

c                       //다음 bp까지 진행

ni [6]                  //assembly 기준 6행 수행.  함수 진입하지 않음

si [5]                  //assembly 기준 5행 수행.  함수 in

n, s                    //source code 기준  

```



stack frame

```bash
info stack              //현재 stack frame 정보 where 명령어와 동일
info f [framenum]       //stack frame 내용 출력

f [num]                 //해당 stack frame으로 이동

up [num]                //상위 스택프레임으로 이동

down [num]              //하위 스택프레임으로 이동

```


signal

```bash

info signal             //signal 종류 출력

signal [signalname]     //디버깅 중인 프로세스에 시그널 전달

```


x/FMT addr

FMT : 숫자+단위+format letter

ex) `` x/12bx``    ( b : byte, x : hex )


format letter

o(octal), x(hex), d(decimal), u(unsigned decimal), t(binary), f(float), a(address), i(instructuion), c(char), s(strig), z(hex, zero padding)


source code

```bash

directory (path)   //소스파일 탐색 경로 지정

objectdir (path)   //오브젝트파일 경로 지정

```


gcc -g 옵션을 주어 컴파일 했을 때 사용 가능한 명령어

```bash

step               //한줄 씩 실행

watch var

list               //소스코드 출력

info local         //지역변수 출력

```


기타 실행

```bash

$ gdb filename coredump

$ gdb processname pid

```

`` pid``로 ATTACH하는 경우, ctrl+Z등으로 stop 걸고 해서는 안되고, ``c getchar()`` 등으로 stop이 아닌 돌아가고 있는 상태에서 새로 쉘 띄워서 거기서 접근해야한다.


자식 프로세스 디버깅

  • 일단 자식 프로세스를 실행하도록 하고 attach
  • 그냥 gdb 위에서 run