jam 블로그

[bof 원정대] zombie_assassin -> succubus (calling functions continuously) 본문

해킹/시스템

[bof 원정대] zombie_assassin -> succubus (calling functions continuously)

kid1412 2012. 3. 29. 13:43
728x90
다음이 문제 소스입니다.

/*

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

}

소스 분석
1. buffer의 크기는 40 
2. 인자값은 적어도 하나 이상
3. 첫번째 인자값에는 \x40이라는 값 자체가 있으면 안됨.
4. DO 함수의 주소값을 가져옵니다.
5. 첫번째 인자값의 44번째 주소값이 DO의 주소값이 아니면 오류
6. buffer 44크기 만큼 초기화, 48번째부터 100크기 만큼을 건너뛰고 초기화
7. buffer 위쪽 3000크기만큼 초기화(전의 문제에서 LD_PRELOAD를 사용 못하게 하려는 용도) 
8. 각 함수(도,개,걸,윷,모)순서대로 접근을 한다음 마지막 모 함수에 cmd를 넣어주어야 합니다.  

풀어야할 과정입니다.  

0. bash2.
1. DO, GYE, GUL, YUT, MO 함수의 주소값, buffer 주소값 구하기
2. bof 공격

 
1.  DO, GYE, GUL, YUT, MO 함수의 주소값, buffer 주소값 구하기

 [그림 1] 각 함수 주소값

 [그림 2] buffer의 주소값


2. bof 공격

함수를 불러야하기 때문에 buffer에 함수 주소값을 넣어서 불러오게 해야합니다.
[buffer 44byte] [DO 함수 주소값] [GYE 함수 주소값] [GUL 함수 주소값] [YUT 함수 주소값] [MO 함수 주소값] [리턴값] [뒤쪽에 써있는 /bin/sh의 주소값] ["/bin/sh"] 

 0xbffffa70에서 /bin/sh의 주소값을 구해야하는데 72byte 뒤쪽에 있기 때문에 0xbffffab8이 됩니다.
 

 [그림 3] bof 공격


Comments