튜기's blogggg

FC3 hell_fire -> evil_wizard

by St1tch





/*
	The Lord of the BOF : The Fellowship of the BOF
	- evil_wizard
	- Local BOF on Fedora Core 3
	- hint : GOT overwriting
*/

// magic potion for you
void pop_pop_ret(void)
{
	asm("pop %eax");
	asm("pop %eax");
	asm("ret");
}

int main(int argc, char *argv[])
{
	char buffer[256];
	char saved_sfp[4];
	int length;

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

	// for disturbance RET sleding
	length = strlen(argv[1]);

        // healing potion for you
        setreuid(geteuid(), geteuid());
        setregid(getegid(), getegid());

	// save sfp
	memcpy(saved_sfp, buffer+264, 4);

	// overflow!!
	strcpy(buffer, argv[1]);

	// restore sfp
	memcpy(buffer+264, saved_sfp, 4);

        // disturbance RET sleding
        memset(buffer+length, 0, (int)0xff000000 - (int)(buffer+length));

	printf("%s\n", buffer);
}

문제를 보면 got overwriting으로 풀어라고 되있다.

다른 보호기법들의 설명은 생략하겠다.




일단 pop_pop_ret함수로 인해 poppopret가 있기 때문에 이전에 가젯이 없어서 못푼 문제와는 달리 공격을 시도할 수 있다.




우선 '/bin/sh'문자열과 system함수의 주소에 쓰이는 값들을 모두 찾아내서 배열로 만들었다.

그리고 got를 overwrite할 함수를 정해야 하는데 나는 그냥  printf로 했다. 별 다른 이유는 없다.


대략 적인 순서는 system주소를 bss영역에 쓴 다음,

printf함수의 got를 bss영역의 주소로 바꾸었다.


그리고 '/bin/sh' 문자열을 다시 bss영역에 쓴 다음,

printf 함수를 호출하고 인수로 bss영역의 주소를 주었다.


이렇게 하면 printf("/bin/sh")가 실행되지만 printf의 got가 system함수의 주소이기 때문에,

결국에 system("/bin/sh") 가 실행이 되어 쉘을 획득할 수 있다.




블로그의 정보

튜기's blogg(st1tch)

St1tch

활동하기