1. gdb file
명시한 file을 gdb로 로드한다.
1-1. gdb -q file
-q 혹은 --quiet 옵션을 주면 gdb를 시작할 때 버전 정보 등을 출력하지 않도록 한다.
1-2. gdb --args file arg1 arg2
gdb 실행 시 --args 옵션을 주면 file과 함께 인자를 전달할 수 있다. (위 예에서는 arg1, arg2 전달)
2. run(r)
gdb로 로드한 프로그램을 실행한다.
참고로 run arg1 arg2 형태로 프로그램을 시작할 때 인자값을 넘길 수 있다.
아니면 처음에 gdb --args file arg1 arg2 이런식으로도 인자값을 전달할 수 있다.
3. disas(disassemble) function
function에 대한 disassemble을 수행 한다.
4. break *address
break *address 명령어는 address 위치에 브레이크 포인트를 설정한다
직접 주소값을 명시하거나 *main+3 이런식으로 사용할 수 있다
또는 break main
이렇게 사용할 수도 있다.
5. x
x 명령어는 주어진 주소 내의 메모리 값이 무엇인지를 확인하는 용도로 사용한다.
그리고 x 명령어에 addr이나 /nfu addr 등의 옵션을 줄 수 있다.
- n (repeat count)
몇 개의 메모리 유닛을 보여줄건지 지정한다. n은 decimal integer로 지정되며 디폴트 값은 1이다. 메모리 유닛은 u로
지정된다.
- f (display format)
읽은 메모리 값을 어떻게 해석할 것인지를 지정한다. 디폴트 값은 x(hexadecimal)이고, 이 외에도 o(octal),
d(decimal), s(string), i(machine instruction) 등이 있다
- u(unit size)
읽을 메모리 유닛의 사이즈를 지정한다. 지정할 수 있는 옵션은 b(byte), h(two bytes), w(four bytes), g(eightbytes)
가 있다.
ex) x/x $esp
esp레지스터의 값(주소)이 가리키는 메모리 값을 16진수로 나타내라는 의미이다
위의 그림에서 현재 esp레지스터의 값은 0xbfffdccc이고, 0xbfffdccc 주소 내의 메모리 값은 0x42015574임을 확인할
수 있다.
한 가지 헷갈리는 점은, AT&T 문법에서는 레지스터의 값을 나타낼 때 레지스터 앞에 %를 붙이고, 상수를 나타낼 때
상수 앞에 $를 붙이는데(ex. %esp, $0x03), gdb에서 x/x 명령어를 사용할 때에는 레지스터 앞에 $를 붙여야 한다는
점이다. (왜그럴까)
ex) x/x $ebp+0xffffffd8
이런식으로 주소 위치에 expression이 들어갈 수도 있다.
해석하면 x/x $ebp+0xffffffd8은 ebp 레지스터가 들고 있는 값에 0xffffffd8을 더한 값을 주소로 명시하고, 해당 주소에
저장된 값을 16진수로 해석하라는 의미가 된다.
명령 수행의 결과에서 왼쪽 0xbfffdca0은 ebp값에 0xffffffd8을 더한 값이고, 오른쪽 0x42130ef8은 해당 주소에 저장
되있었던 값을 16진수로 표현한 결과이다.
ex) x/s
0x8048680 주소에 저장된 값을 string format으로 읽는다.
5-1. print variable
variable에 저장된 값을 출력 한다.
ex) print main
ex) print system
6. continue(c)
다음 브레이크포인트 전까지 코드를 실행한다.
6. ni(nexti) [n]
라인 하나를 실행 하되 함수 호출문은 건너 뛴다. n을 명시 하면 n개 만큼 코드를 실행한다.
7. si(stepi) [n]
라인 하나를 실행 하되 함수 호출 시 해당 함수로 들어 간다. n을 명시 하면 n개 만큼 코드를 실행 한다.
8. delete [n]
설정했던 모든 브레이크 포인트들을 삭제한다. n을 명시해서 특정 브레이크 포인트만 삭제할 수도 있다.
9. info registers [register name]
레지스터들의 값들을 출력한다. register name을 지정해서 특정 레지스터에 대한 값만
확인할 수도 있다.
10. quit (혹은 q)
gdb를 종료한다.
'Linux > 공개글' 카테고리의 다른 글
버퍼 오버플로우 공격 환경 구성 (0) | 2015.02.26 |
---|---|
랜덤 스택 사용을 disable 하는법 (0) | 2015.02.22 |
Couldn't get registers: Operation not permitted (0) | 2015.01.10 |
SetUID, SetGID, Sticky Bit에 대해서 (0) | 2015.01.05 |
find -perm mode 옵션에 대해서 (0) | 2015.01.05 |