GDB (The GNU Project Debugger)
GDB는 컴퓨터 프로그램의 실행을 추적하고 수정할 수 있는 많은 기능들을 제공한다. 사용자는 프로그램의 내부 변수들의 값을 주시하거나 변경할 수 있으며, 프로그램의 일반적인 실행 과정과 독립적으로 함수를 호출할 수도 있다.
시스템 해킹에서 gdb를 사용할 경우 분석해야 하는 바이너리는 디버깅을 위해 컴파일 된 바이너리가 아니기 때문에 변수 이름이나 메인 함수 같은 디버깅을 위한 심볼이 없는 경우가 많다. 그렇기 때문에 심볼이 있어야만 사용 가능한 명령어들은 제외하고 자주 쓰이는 명령어를 잘 숙지해두는 것이 gdb에 익숙해지는데 도움이 된다.
GDB는
동적 디버거로 대부분의 명령어는 프로그램이 실행된
이후에 가능하다.
Run(r)을
이용해 대상 프로그램을 실행시켜 메모리에 로딩한
후 분석을 할 수 있다.
Gdb “프로그램명”
-c, -p 등의 옵션을 이용해 상황에 따라 실행할 수 있다. (man gdb 참고)
Disas func : func 함수의 어셈블리어 코드를 출력한다. 함수 이름을 찾아갈 수 있을 때만가능하다.
밑의 메모리확인 명령에서 x/i $eip를 이용하여 볼 수 있다.
Break(b) func
Break(b) *func+5
Break(b) *0x8040000
Info break (I b) : 현재 걸려있는 모든 break point를 확인한다
Cl func : func함수에 걸린 브레이크포인트 지우기
Delete(d) : 브레이크포인트 모두 지우기
[+] 진행 명령어
Run argv[1] argv[2] 형식으로 인자를 전달할 수 있다.
Kill(k) : 프로그램을 종료한다
Si : 다음 인스트럭션(명령어)을 실행하는데 만약 함수라면 함수 안으로 들어간다.
Ni : 다음 인스트럭션(명령어)을 실행한다. 함수 안으로 진입하지 않는다.
[+] 메모리
검사
x/”범위”“출력형식”“범위의단위”
“메모리주소 또는 함수명”범위 : 범위의단위 * 범위byte 출력
출력형식 : x (16진수), s (문자열) , I (명령어)
범위의단위 : b (1byte), h(2byte), w(4byte), g(8byte)
EX)
x/20wx $esp : esp가 가리키는 메모리로부터 높은 주소 쪽으로 4byte씩 20개를 출력다.
x/10i $eip : 현재 eip의 명령어로부터 10줄의 어셈블리어를 출력한다.
x/s 0x8040000 : 0x8040000에서 시작하는 문자열을 출력한다.
[+] 기타
- 레지스터 상태 확인하기
-AT&T 어셈블리어 명령어를 Intel 어셈블리어 명령어로 바꾸기
Set disassembly-flavor intel
-
특정 메모리에 원하는 값 넣기
Set {int}0x8040000 = 123
Set {int}$edx = 123
-
매 실행 시 특정 명령어 반복하기
Disp/4x $esp : 매 명령마다 esp에서부터 16byte의 스택을 출력한다.
Disp는 명령어를 쌓아서 명령 시 원하는 출력이 보기게 할 수 있다.
-
shell 실행하기
!ps : 현재 돌고 있는 프로세스를 볼 수 있다.
!cat /proc/$pid/maps : $pid의 프로세스의 전체적인 메모리 상태를 볼 수 있다.