Post

gdb

fork/exec 설정

peda와 cgdb를 사용할 것.

1
2
3
4
set env LD\_PRELOAD=./libc.so.6
set {void\*}0x80dfff7a = 0xff
set $rdx=0x98583

1
2
3
4
5
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, ...]

1
2
3
4
watch $eax        //eax가 변경될 때 마다 중단
d [num]    // bp 지우는 것과 똑같다.
display $eax      //중단될 때 마다 eax값 출력

1
2
3
4
5
6
7
8
9
p [수식 또는 변수]       //변수의 value 출력. 수식 입력 시 계산기 처럼 사용하기 좋음.
p/d 16

  

(gdb) r < <(python -c 'print "123\x0045\x0167"')    // stdin
bt                // backtrace. 죽기 직전 호출했던 call stack 확인.
!                 // vi처럼 임시 shell 실행

Useful
1
2
3
4
5
6
7
8
9
u                       //현재 반복문을 빠져나감
finish                  //현재 함수를 수행하고 return
return [retval]         //현재 함수를 수행하지 않고 return. retval을 지정할 수 있음.

  

call [func(arg...)]                //함수 호출
jump [\*addr | linenum | func]      //강제 분기

show
1
2
3
4
5
6
7
8
9
10
11
12
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
1
2
3
4
5
6
7
8
9
10
11
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와 동일한 옵션으로 사용

1
2
3
4
5
6
c                       //다음 bp까지 진행
ni [6]                  //assembly 기준 6행 수행.  함수 진입하지 않음
si [5]                  //assembly 기준 5행 수행.  함수 in
n, s                    //source code 기준

stack frame
1
2
3
4
5
6
info stack              //현재 stack frame 정보 where 명령어와 동일
info f [framenum]       //stack frame 내용 출력
f [num]                 //해당 stack frame으로 이동
up [num]                //상위 스택프레임으로 이동
down [num]              //하위 스택프레임으로 이동

signal
1
2
3
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
1
2
3
directory (path)   //소스파일 탐색 경로 지정
objectdir (path)   //오브젝트파일 경로 지정

gcc -g 옵션을 주어 컴파일 했을 때 사용 가능한 명령어
1
2
3
4
5
step               //한줄 씩 실행
watch var
list               //소스코드 출력
info local         //지역변수 출력

기타 실행
1
2
3
$ gdb filename coredump
$ gdb processname pid

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

자식 프로세스 디버깅
  • 일단 자식 프로세스를 실행하도록 하고 attach
  • 그냥 gdb 위에서 run
This post is licensed under CC BY 4.0 by the author.