lob

orge

oogu ㅣ 2022. 12. 10. 18:18

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

 

[그림 1-1]

스택은 바뀌지가 않는다 ㅋ

[그림 1-2]

argc 개수 제한 때문에 argv[2]에 못 넣고 argv[1]은 초기화된다. 따라서 argv[0]에 shellcode를 넣어야겠다. -> 생각은 했는데 어떻게 넣는지 몰라서 삽질.. 파이썬으로 하면되는데..

 

[그림 1-3]

[그림 1-3] 보면 실패가 된다.

이걸 찾아보니 파일이름에 "\x2f"가 들어가게되면  그 의미가 " / " 가 되어서 디렉토리 구분인자로 인식되어버리기 때문에 이름을 제대로 바꿀 수가 없다. 그렇기 때문에 "\x2f"가 없는 쉘코드를 사용해야한다.

 

\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

구글링해서 위 쉘코드를 가져왔다. /x2f 없음ㅋ

[그림 1-4]

성공!

파일명을 nop와 shellcode로 변경했다. -> argv[0]에 nop와 shellcode를 넣었다.

payload = nop*44 + argv[0] 주소이다.

argv[0] 주소를 찾자!

[그림 1-5]

main을 실행하기전(b *main) break를 걸고 run 한다. -> argv[0] 찾기위해, ebp가 들어가기 전

0xbffffa54가 argv 이다.

0xbffffa54 두 개만 열어 보면 0xbffffb4b와 0x0000000 존재한다. 각 argv[0], argv[1] 이다. argv[1]은 입력하지 않았기 때문에 0 이다.

0xbffffb4b 열어보면 argv[0](파일명) 이 존재한다. 

[그림 1-6]

[그림 1-6] 보면 argv[0] 주소는 0xbffffb5c이다.

exploit 해보자!

[그림 1-7]

Segmentation... 아마 argv[0] 주소가 아닌곳으로 들어간거 같다. Core 뒤져봐야한다.. 아 그리고 파일명이 깨져있는데 [그림 1-7] 처럼 파이썬을 사용해야한다.! -> 이것도 삽질함..

 

[그림 1-8]

argv[0] 주소가 잘못되었으니 argv[0] 값을 찾아보자..\x90 가 100개니까..

[그림 1-9]

찾음 ㅋ payload를 0xbffffa8f로 바꿔보자

[그림1-10]

tmp 에서 땄다. 디렉토리 이동해서 해보자

[그림 2-1]

성공! 

 

1. 파일 명에 shellcode를 넣을라면 python 쓰자!

2. 파일 명에 \x2f가 들어가면 안된다!

3. 깨진 파일 명은 python을 이용해서 실행하자!

'lob' 카테고리의 다른 글

vampire  (0) 2022.12.12
troll  (0) 2022.12.11
darkelf  (0) 2022.12.10
wolfman  (0) 2022.12.09
orc  (0) 2022.12.09