fork/exec 설정
peda와 cgdb를 사용할 것.
1
2
3
| set env LD\_PRELOAD=./libc.so.6
set {void\*}0x80dfff7a = 0xff
set $rdx=0x98583
|
1
2
3
4
| 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
| watch $eax //eax가 변경될 때 마다 중단
d [num] // bp 지우는 것과 똑같다.
display $eax //중단될 때 마다 eax값 출력
|
1
2
3
4
5
6
7
8
| 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
| 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
| 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
| 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
|
c //다음 bp까지 진행
ni [6] //assembly 기준 6행 수행. 함수 진입하지 않음
si [5] //assembly 기준 5행 수행. 함수 in
n, s //source code 기준
|
stack frame
1
2
3
4
5
| info stack //현재 stack frame 정보 where 명령어와 동일
info f [framenum] //stack frame 내용 출력
f [num] //해당 stack frame으로 이동
up [num] //상위 스택프레임으로 이동
down [num] //하위 스택프레임으로 이동
|
signal
1
2
| 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
| directory (path) //소스파일 탐색 경로 지정
objectdir (path) //오브젝트파일 경로 지정
|
gcc -g 옵션을 주어 컴파일 했을 때 사용 가능한 명령어
1
2
3
4
| step //한줄 씩 실행
watch var
list //소스코드 출력
info local //지역변수 출력
|
기타 실행
1
2
| $ gdb filename coredump
$ gdb processname pid
|
pid
로 ATTACH하는 경우, ctrl+Z등으로 stop 걸고 해서는 안되고, getchar()
등으로 stop이 아닌 돌아가고 있는 상태에서 새로 쉘 띄워서 거기서 접근해야한다.
자식 프로세스 디버깅
- 일단 자식 프로세스를 실행하도록 하고 attach
- 그냥 gdb 위에서 run