반응형

출처: http://orang.tistory.com/category/System%20Hacking/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%ED%95%B4%ED%82%B9%20%EA%B3%B5%EB%B6%80


FTZ나 LOB같은 문제 풀이를 하다보면..

[nop]... + [셸코드] + [SFP] + [RET] 는 세그먼트 오류가 나고,

[셸코드] + [nop]... + [SFP] + [RET] 는 공격에 성공하는 경우 를 발견할 수 있습니다.

 

1번째 방법은 안되고, 2번째 방법은 되는 차이를 간단하게 보자면..

1번째 방법의 문제를 간단한 메모리로 보겠습니다.



RET에 함수 주소가 들어오기 전 스택입니다.

이상태에서 leave와 ret 명령어가 실행되는 상황을 통해 보겠습니다.

 

leave 명령어는

mov esp, ebp

pop ebp

esp를 ebp로 옮기고(스택을 정리해주고), 이전 함수의 ebp(SFP)를 pop을 통해 다시 ebp에 저장합니다.

pop 되었으니 esp는 RET를 가리킵니다.

다시 스택을 보면..



이제 ret가 실행됩니다.

ret 명령어는

pop eip

jmp eip

현재 eip 다음에 실행될 명령어를 eip 레지스터에 저장하고 eip 주소로 점프합니다.

eip의 주소(nop+shellcode)로 점프한 후, esp는 RET+4 지점을 가리키고 있습니다.

여기서 문제가 발생합니다

스택을 보면.. 



shellcode가 실행되기 시작합니다. push명령어도 셸코드에 포함되어 있겠죠?

push 명령어가 실행될 때마다 현재 esp로부터 4바이트씩 덮어쓰며 esp가 낮은 메모리 주소 방향으로 이동합니다.

결론적으로 말하면 shellcode와 RET 사이에 충분한 여유공간이 없을 경우,

 esp가 shellcode를 덮어쓰게되며 세그먼트 오류가 발생하게 됩니다. 

반응형
반응형

출처: http://huammmm1.tistory.com/494

http://cr3denza.blogspot.kr/2014/12/gdb-gnu-project-debuger-command.html



GDB (The GNU Project Debugger)



 GDB는 컴퓨터 프로그램의 실행을 추적하고 수정할 수 있는 많은 기능들을 제공한다. 사용자는 프로그램의 내부 변수들의 값을 주시하거나 변경할 수 있으며, 프로그램의 일반적인 실행 과정과 독립적으로 함수를 호출할 수도 있다.


시스템 해킹에서 gdb를 사용할 경우 분석해야 하는 바이너리는 디버깅을 위해 컴파일 된 바이너리가 아니기 때문에 변수 이름이나 메인 함수 같은 디버깅을 위한 심볼이 없는 경우가 많다. 그렇기 때문에 심볼이 있어야만 사용 가능한 명령어들은 제외하고 자주 쓰이는 명령어를 잘 숙지해두는 것이 gdb에 익숙해지는데 도움이 된다.

GDB는 동적 디버거로 대부분의 명령어는 프로그램이 실행된 이후에 가능하다. Run(r)을 이용해 대상 프로그램을 실행시켜 메모리에 로딩한 후 분석을 할 수 있다.



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


이렇게 사용할 수도 있다.


Break(b) func
Break(b) *func+5
Break(b) *0x8040000
Info break (I b) : 현재 걸려있는 모든 break point를 확인한다
Cl func : func함수에 걸린 브레이크포인트 지우기
Delete(d) : 브레이크포인트 모두 지우기



5. x


x 명령어는 주어진 주소 내의 메모리 값이 무엇인지를 확인하는 용도로 사용한다.


그리고 x 명령어에 addr이나 /nfu addr 등의 옵션을 줄 수 있다.


[+] 메모리 검사

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에서 시작하는 문자열을 출력한다.



- 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)


다음 브레이크포인트 전까지 코드를 실행한다.




[+] 진행 명령어

Run(r) : 프로그램을 수행한다.
Run argv[1] argv[2] 형식으로 인자를 전달할 수 있다.
Kill(k) : 프로그램을 종료한다
Si : 다음 인스트럭션(명령어)을 실행하는데 만약 함수라면 함수 안으로 들어간다.
Ni : 다음 인스트럭션(명령어)을 실행한다. 함수 안으로 진입하지 않는다.


7. ni(nexti) [n]


라인 하나를 실행 하되 함수 호출문은 건너 뛴다. n을 명시 하면 n개 만큼 코드를 실행한다.



8. si(stepi) [n]


라인 하나를 실행 하되 함수 호출 시 해당 함수로 들어 간다. n을 명시 하면 n개 만큼 코드를 실행 한다.



9. delete [n]


설정했던 모든 브레이크 포인트들을 삭제한다. n을 명시해서 특정 브레이크 포인트만 삭제할 수도 있다.



10. info registers [register name]


레지스터들의 값들을 출력한다. register name을 지정해서 특정 레지스터에 대한 값만


확인할 수도 있다.






-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의 프로세스의 전체적인 메모리 상태를 볼 수 있다.


11. quit (혹은 q)


gdb를 종료한다.


반응형
반응형

출처:http://mrain7.egloos.com/2725507

 

 

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin = 로컬 프린트 서버

sync:x:5:0:sync:/sbin:/bin/sync = 원격지 서버 동기화

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown = soft 시스템 종료

halt:x:7:0:halt:/sbin:/sbin/halt = 강제시스템 종료

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin = 메일 서비스 계정

news:x:9:13:news:/etc/news:/sbin/nologin

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin = 유닉스 시스템간 파일을 복사 할 수 있는 프로토콜

operator:x:11:0:operator:/root:/sbin/nologin = 설정에 따라 다르지만 /etc/syslog.conf 에 대해서 daemon.err operator라고 표기가 되어 있다면 데몬 관련 에러를 operator계정을 이용해서 출력하라는 의미다.

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin = 웹(www)가 나오기전 대표적인 서비스중 하나 gopher사이트 접속후 잘정리된 메뉴를 이용해서 웹서핑을 즐기도록 한 서비스

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin = ftp사용시 필요

nobody:x:99:99:Nobody:/:/sbin/nologin = 익명 연결(웹 서비스등 누구나 연결이 가능해야 되는 서비스가 있는 경우 필요)

dbus:x:81:81:System message bus:/:/sbin/nologin = 시스템 메세지

vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin = 가상메모리 생성시 계정

rpm:x:37:37::/var/lib/rpm:/sbin/nologin = 레드헷 패키지 매니저

haldaemon:x:68:68:HAL daemon:/:/sbin/nologin = 디바이스 장치 인식을 위한 데몬

ident:x:98:98::/home/ident:/sbin/nologin inetd에서 구동되는 데몬

netdump:x:34:34:Network Crash Dump user:/var/crash:/bin/bash = 네트워크 오류를 파일로 저장하는 계정

nscd:x:28:28:NSCD Daemon:/:/sbin/nologin = 네임서비스에 대한 캐쉬기능 제공

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin = 보안쉘 계정

rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin = 원격 호출에 관한 데몬

mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin = 메일큐

smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin = sendmail관련으로 메일을 보낼때 root가 아닌 smmsp로 보내게 된다

rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

pcap:x:77:77::/var/arpwatch:/sbin/nologin = 패킷 캡쳐 관련 라이브러리 계정

apache:x:48:48:Apache:/var/www:/sbin/nologin = httpd 사용

squid:x:23:23::/var/spool/squid:/sbin/nologin = 프록시 서버

webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin = 웹로그 분석 프로그램

xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin = 저널링 파일 시스템

ntp:x:38:38::/etc/ntp:/sbin/nologin = 컴퓨터간 시간을 동기화 시켜주기 위하여 만들어진 Network Time Protocol 이다.

gdm:x:42:42::/var/gdm:/sbin/nologin = x-window사용

pegasus:x:66:65:tog-pegasus OpenPegasus WBEM/CIM services:/var/lib/Pegasus:/sbin/nologin =
System Center Operation Manager가 이기종 환경을 관리할 수 있도록 확장(window에서 linux등의
이기종 환경에 대해 Cross-Platform Extension을 제공

htt:x:100:103:IIIMF Htt:/usr/lib/im:/sbin/nologin = 한국어 일본어 중국어에 대한 입력 방식

named:x:25:25:Named:/var/named:/sbin/nologin = 도메인 서버사용시 사용하는 계정

pvm:x:24:24::/usr/share/pvm3:/bin/bash = 병렬 컴퓨팅(클러스터링 관련 계정)

 

 

반응형
반응형

출처: http://faq.hostway.co.kr/?mid=Linux_ETC&page=2&document_srl=1624

 

/bin/false, /sbin/nologin 의 차이점

/etc/passwd 사용자계정 부분에 /bin/false, /bin/nologin 등으로 설정할 경우가 있는데 그 차이점입니다.
 
/bin/false

allows a login, but no shell, no ssh tunnels and no home directory.

-> 시스템의 로그인은 불가능, FTP 서버 프로그램같은 프로그램도 불가능하다.

쉘이나 ssh과 같은 터널링(원격접속) 그리고 홈디렉토리를 사용할 수 없다.
 
/sbin/nologin

disallows logins completely and returns a polite account unavailable message.

-> 사용자 계정의 쉘부분에 /bin/nologin 으로 설정을 하면

로긴 불가하고, 메시지들은 반환된다 ssh는 사용불가능하며 ftp의 경우 사용이 가능합니다.

반응형

+ Recent posts