第1步:编写源程序。编写C语言源程序,保存为buffer_flow.c文件。 第2步:编译源程序 执行gcc buffer_flow.c -o buffer_flow命令,编译源程序。 第3步:执行程序。执行./buffer_flow.o命令,输出结果99999。通过分析主函数的流程,应该输出1,可是为什么输出99999呢?原因在于funtion()函数。结合调用函数function(1, 2, 3)的过程图分析程序的溢出过程并说明原因
时间: 2024-03-26 19:42:00 浏览: 52
假设程序中的 `function()` 函数如下:
```c
void function(int a, int b, int c) {
int buffer1[5];
int buffer2[10];
int *ret;
ret = buffer1 + 12;
(*ret) += 8;
}
```
程序调用 `function(1, 2, 3)` 的过程如下:
1. 在 `main()` 函数中,将参数 1、2、3 依次压入栈中,并调用 `function()` 函数。
2. 在 `function()` 函数中,首先分配了两个数组 `buffer1` 和 `buffer2`,它们分别占用了 20 个字节和 40 个字节的内存空间。
3. 在 `function()` 函数中,将 `buffer1` 数组的地址加上 12 个字节,赋值给了指针 `ret`。此时指针 `ret` 指向了 `buffer2` 数组的起始地址。
4. 在 `function()` 函数中,将指针 `ret` 指向的地址处的整数值加上 8。注意,此时指针 `ret` 指向的地址已经超出了 `buffer1` 数组的边界,进入了 `buffer2` 数组的内存空间。因此,这个操作实际上是修改了 `buffer2` 数组中的某个整数值。
5. `function()` 函数执行完毕后,返回到 `main()` 函数中。此时,栈指针会退回到之前的位置,但是 `ret` 指针指向的内存空间已经被修改了,其值变成了 `buffer2` 数组中的某个整数值加 8。
6. 在 `main()` 函数中,调用 `printf()` 函数输出 `ret` 指针指向的整数值。由于 `ret` 指针指向了 `buffer2` 数组的某个位置,因此输出的是 `buffer2` 数组中的某个整数值加 8。
综上所述,程序输出的值是 `buffer2` 数组中的某个整数值加 8,而这个值是由 `function()` 函数修改的。由于 `function()` 函数的实现中没有对数组边界进行检查,因此可能会越界访问 `buffer2` 数组的内存空间,导致程序出现错误的输出。
阅读全文