예시 코드

- main 함수에서 매개변수로 받은 문자열을 vuln에 인자로 넣어 호출하고
- vuln 함수는 buf라는 길이 32의 배열과 매개변수로 받은 문자열을 인자로하여서 다시 strcpy를 호출한다.
- strcpy는 첫번째 인자에 두번째 인자(문자열)의 값을 저장하는 함수이다.
- C언어는 문자열의 끝을 null로 인식한다.
- 이 함수는 복사할 문자열의 길이를 검사하지 않는 취약성을 가진(vulnerable) 함수이다.
- 현재는 C언어로 코딩 시 이 함수를 쓰면 경고를 표시하며 이 함수를 대체로 길이를 검사하는 함수인 strncpy를 쓰는 것으로 알고 있다.
사전 지식
- 먼저, 레지스터 3개를 알아야 한다.
- EBP : 현재 스택프레임의 베이스를 가리키는 포인터.
- ESP : 현재 스택프레임의 최상단을 가리키는 포인터.
- PC : 프로그램 카운터. 다음에 실행할 명령어를 가리키는 포인터.

- 이것은 위 코드의 어셈블리어 모습이다.
- 어셈블리어는 컴퓨터가 실제 실행하는 기계어와 한줄한줄이 거의 1대1로 대응되는, 기계어를 사람이 알아볼 수 있게 번역한 언어라고 할 수 있다.
- PC는 지금 실행하는 명령어의 바로 다음줄을 가리킨다.
- 그런데 이와 같이 main함수의 명령어를 실행하다가 vuln함수를 콜하는 명령어를 만난다면 어떻게 될까?
- PC의 현재 다음줄의 주소값은 스택에 저장해 놓은 후 다음 줄이 아닌, vuln함수가 있는 곳을 가리키게 한다. 그러면 call 명령어를 읽은 후에 그 함수의 명령어를 실행하게 된다.

- 스택프레임이란 간단하게 말하자면 현재함수를 실행하는 동안 필요한 데이터들을 보관하는 영역이라고 볼 수 있다.