Look at this code :
void f()
{
f();
}
I know that because so many f()
functions are called, StackOverflow occurs.
But my question is what is exactly stored in the stack that causes this error, return address for each f()
function call?
Because this function has no variables, so why does StackOverflow occur?
As the other answers already said, it's because of the return addresses.
void f(){
f();
}
compiles to
f:
call f #Let's assume f has the address 0x1000 for later purposes
ret
But what does call
do?
It does two things:
f:
push %rip
jmp 0x1000
ret
If you "unroll" this calls you have:
f:
push %rip
push %rip
push %rip
push %rip
push %rip
push %rip
....
And so on. As you can see, you always push an address to the stack. This works until you hit other areas and overwrite them. (This illustration assumes an architecture with a backwards-growing stack, like x86)
[heap].......[stack pointer][stack] #Start
[heap]......[stack pointer][stack ] push %rip
[heap].....[stack pointer][stack ] push %rip
[heap]....[stack pointer][stack ] push %rip
[heap]...[stack pointer][stack ] push %rip
[heap]..[stack pointer][stack ] push %rip
[heap].[stack pointer][stack ] push %rip
[heap][stack pointer][stack ] push %rip
[heap[stack pointer][stack ]# Boom, you for example reached the heap and you are overwriting it.