문저 문제의 소스코드를 봐보자.

#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 함수에서 문자열 overflowme를 32byte 까지 할당 받을 수 있다

그다음 정수형 변수로 선언받은 key 값이 0xcafebabe 로 같아지면 된다.

대놓고 변수명과 문제 이름에서부터 Buffer Over Flow 공격을 하라고 나와있는 문제다.

즉 입력받는 overflowme 변수를 통해 키 값까지의 메모리 영역을 다 덮어버리고 이후 key 값 위치에 0xcafebabe 라는 값이 들어가게 하면 된다.

먼저 pwngdb를 활용하여 key 값 위치와 입력받는 변수 overflowme 변수의 위치를 확인해 볼 필요성이 있다.

func 함수를 디스어셈블리한 값이다.

func + 40 부근에 어셈블리어 cmp를 통해 두개의 값을 비교하는 걸 볼 수 있다. 이중 ebp+0x8 을 0xcafebabe와 비교를 함으로 문제 코드에 맞게 if문 코드와 동일한 부분인 것을 확인할 수 있다.

ebp + 0x8  == Key 로 나타낼 수 있다.

다음은 변수 overflowme 이다.

위는 프린트 하는 부분 근처에 존재할 것이기에 쉽게 찾아낼 수 있을 거 같다.

func + 29 부근인 것을 확인할 수 있다.

이유로는 key 값을 나타내는 곳 바로 위에 있을 뿐더러 해당 부분까지 디버깅을 시도하며 실행시켜보면 다음과 같은 창이 뜬다.

Overflow me : 가 출력되고 이후 gets 함수가 실행되므로 이후 저장값으로 볼 수 있다. 즉 우리가 입력하는 변수의 위치는 ebp - 0x2c가 맞을 것이다.

스택 구조로 생각하면