튜기's blogggg

FC3 evil_wizard -> dark_stone

by St1tch




/*
	The Lord of the BOF : The Fellowship of the BOF
	- dark_stone
	- Remote BOF on Fedora Core 3
	- hint : GOT overwriting again
	- port : TCP 8888
*/

#include <stdio.h>

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

int main()
{
	char buffer[256];
	char saved_sfp[4];
	int length;
	char temp[1024];

	printf("dark_stone : how fresh meat you are!\n");
	printf("you : ");
	fflush(stdout);

	// give me a food
	fgets(temp, 1024, stdin);

	// for disturbance RET sleding
	length = strlen(temp);

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

	// overflow!!
	strcpy(buffer, temp);

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

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

	// buffer cleaning
	memset(0xf6ffe000, 0, 0xf7000000-0xf6ffe000);

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

got overwrite문제인데 전 문제와 차이점이 있다면 remote bof라는 점이다.

이 전문제 + 전전문제를 합친거 같은 느낌이다.


우선 접근 방법을 생각을 했다.

나는 처음에 strace로 stdin영역의 주소를 안 후, 쉘코드를 올려놓고

 이 영역을 mprotect로 실행권한을 준 후 이 영역을 실행하려고 했다. 

전전문제와 비슷하지만 main함수 종료시 stdin 버퍼를 초기화 하기 때문에 rop로 하나하나 올려야 되기 때문에 opcode를 찾기 귀찮아서 일단 패스했다.


그다음 접근 방법은 직전문제와 같은 방법으로 함수하나를 골라 system함수로 got overwrite한 후,  

stdin버퍼에 '/bin/sh'를 올려놓고 그 함수를 실행시키는 방법이다.

근데 stdin버퍼의 주소를 이용하니 익스플로잇이 되지 않았다.

아마 main함수가 종료될 때 뭐 메모리가 회수 된다고 생각했다. (근데 전전문제에서는 잘 되었다. 확실한 이유는 잘모르겠다.)


최종적인 방법으로 자주 이용하는 bss영역을 이용하여 printf함수의 got를 system함수의 주소로 overwrite하고, '/bin/sh'문자열을 올리고 printf함수를 실행했다. 

이렇게 되면 printf가 실행되지만 printf의 got가 system함수의 주소이기 때문에 결과적으로 system함수가 실행이 된다.





순서는 got overwrite -> rop를 이용해 '/bin/sh' write -> printf실행

위 과정의 payload를 작성한 뒤 소켓통신을 통해 보낸뒤 쉘을 획득하였다.




블로그의 정보

튜기's blogg(st1tch)

St1tch

활동하기