前两篇文章介绍了栈帧和函数调用约定,这篇文章通过一个简单的程序来具体说明一下调用函数时都经历了哪些步骤。(建议结合着栈帧的介绍和调用约定的介绍这两篇来理解这篇文章,然后通过一个buffer overflow的实例进行深入的理解)。
首先看一下源码,非常简单的一个例子,定义了一个foo()
函数,将传入的参数x
和y
的和赋值给z
,然后返回z
。main()
函数中调用了foo()
函数,将返回结果赋值给a
并打印。
#include <stdio.h>
int foo(int x, int y)
{
int z;
z = x + y;
return z;
}
int main(int argc, char* argv[])
{
int a;
a = foo(5, 6);
printf("a = %d", a);
}
用pwndbg调试一下,在main函数下断点&