문저 문제의 소스코드를 봐보자.
#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가 맞을 것이다.
스택 구조로 생각하면