Pwnstar

Pwnable.kr fsb 본문

Pwnable.kr/Rookiss

Pwnable.kr fsb

포너블처돌이 2020. 6. 25. 17:33

 

이 문제는 꽤 오래 전에 풀었던 문제인데 익스가 날아가서 다시 풀어보며 라업을 쓰려고 한다.

 

문제 이름대로 fsb를 이용해 푸는 문제였던 것으로 기억한다.

 

소스코드

fsb.c

#include <stdio.h>
#include <alloca.h>
#include <fcntl.h>

unsigned long long key;
char buf[100];
char buf2[100];

int fsb(char** argv, char** envp){
	char* args[]={"/bin/sh", 0};
	int i;

	char*** pargv = &argv;
	char*** penvp = &envp;
        char** arg;
        char* c;
        for(arg=argv;*arg;arg++) for(c=*arg; *c;c++) *c='\0';
        for(arg=envp;*arg;arg++) for(c=*arg; *c;c++) *c='\0';
	*pargv=0;
	*penvp=0;

	for(i=0; i<4; i++){
		printf("Give me some format strings(%d)\n", i+1);
		read(0, buf, 100);
		printf(buf);
	}

	printf("Wait a sec...\n");
        sleep(3);

        printf("key : \n");
        read(0, buf2, 100);
        unsigned long long pw = strtoull(buf2, 0, 10);
        if(pw == key){
                printf("Congratz!\n");
                execve(args[0], args, 0);
                return 0;
        }

        printf("Incorrect key \n");
	return 0;
}

int main(int argc, char* argv[], char** envp){

	int fd = open("/dev/urandom", O_RDONLY);
	if( fd==-1 || read(fd, &key, 8) != 8 ){
		printf("Error, tell admin\n");
		return 0;
	}
	close(fd);

	alloca(0x12345 & key);

	fsb(argv, envp); // exploit this format string bug!
	return 0;
}

 

fsb 함수를 보면 4번에 걸쳐 입력을 받는데, 함수 아래쪽에 쉘을 실행시켜주는 부분이 있는 것으로 보아 특정함수 got를 저 부분으로 뛰면 될 것 같다.

 

사실 fsb를 이용해서 key 값을 출력해보려고도 했는데  스택에 key 값이 올라와있지 않아서 그렇게 할 수가 없었다.

 

이제 할 수 있는 방법은 printf나 sleep 함수를 쉘을 실행시키는 부분으로 덮는 것인데 입력 값이 스택에 그대로 올라가지 않아서 그것도 녹록치 않다.

 

이제 다른 방법은 스택에서 다른 스택 주소를 가리키는 부분을 찾는 것인데,

 

 

자세히 보니 그런 부분이 있다. 0xffbd9da10을 가리키는 부분이 있다. esp에서 15번째 떨어져 있고, 0xffbd9da10는 esp에서 21만큼 떨어져 있으니 그 부분을 이용하면 될 듯 하다. 그 이외에도 다른 부분들도 있지만 이 부분을 이용해보자.

 

정정

15, 21인줄 알았는데 fsb 출력을 해 보면 esp+4부터 출력된다 그러므로 14, 20이다.

 

printf got는 0x804a004 = 134520836‬

 

덮을 부분은

 

이 부분으로 잡자 0x80486a6 = 134514342‬

 

총 2번의 입력이 필요하다.

%134520836‬c%14$n

%134514342c‬%20$n

 

이렇게 입력을 줘 보자.

 

로컬에서 성공했고, 이제 서버에서 돌려보자

성공하긴 했는데 무척 오래걸렸다.

 

하 이거 또 할 자신이 없다 거의 30분 가까이 걸린듯 하다.

 

 

'Pwnable.kr > Rookiss' 카테고리의 다른 글

Pwnable.kr otp  (0) 2020.07.28
Pwnable.kr syscall  (0) 2020.07.22
Pwnable.kr tiny_easy  (0) 2020.06.25
Pwnable.kr dragon  (0) 2020.06.16
Pwnable.kr ascii_easy  (0) 2020.06.16
Comments