Buffer Overflow는 가상 메모리 상에서 이루어지는 변수 / 함수 흐름, 그리고 메모리 상에서의 경계를 이해해야만 알 수 있는 내용이다. 위 그림과 같이 Program은 가상 메모리의 하위에 위치하게 되고, Stack은 그 위에서 Program의 함수 이용에 따라 Down 되면서 변수를 쌓았다가 뺐다가 하는 일련의 작업을 하게 된다.
함수를 호출하게되면, 변수가 먼저 stack에 쌓이게 되고 (PUSH EAX), main에서 Call Func()를 하게 되고, Stack Base Pointer를 잡기 위해 EBP를 PUSH 후 (PUSH EBP), MOV EBP, ESP 를 진행, 함수 최초 시작 시에 Stack Pointer는 그 함수의 Base Pointer가 될 것이기 때문. 후에 다시 main으로 돌아갈 Ret 주소를 쌓고, (PUSH Ret), 지역 변수를 쌓게된다. (PUSH func.Buffer[128])
이때, Buffer에 128 이상의 값이 들어가게되면, (c) 그림과 같이 Return Addr과 EBP 영역까지 침범하게 된다. 이 때, Return Addr이 침범된 데이터에 의해 값이 변형 되고, 이에 따라 함수가 끝나고, 복귀 시점이 다가올 때, 엉뚱한 곳으로 Return 하게 된다. 이 때, Crash가 발생하며 엉뚱한 Return 주소에 공격자가 원하는 Shell Code가 있을 경우, 추가적인 악성 행위를 진행하게 된다.
기본적인 내용이지만, 위 내용과 같은 기본적인 기술로 ZeroDay Attack도 가능한 것이다.