用C语言写一段程序,模拟函数缓冲区溢出攻击(buffer overrun)。

来源:百度知道 编辑:UC知道 时间:2024/06/25 09:47:58
详细要求:main函数调用函数foo,foo调用foo1,foo1的栈帧被破坏,返回到另一个函数foo2,foo2完成自己的计算后返回foo,foo正常返回main。
在各函数中使用printf向屏幕输出一些信息,以便辨识各函数的工作状态。
(最好能提供能通过调试的代码,谢谢)
在线等回复,重酬!!!!!

这个基本上没办法给你写例子,受编译环境影响太大。

原理很单纯,就是把函数局部变量作为基址可以直接修改函数的返回地址。用汇编很好办,但C的话很多必要地址只能编译好了才能知道。

----

VS2008 Debug模式编译 关闭Incremental Linking

#include <stdio.h>

void foo();

// __stdcall为了foo2在返回的时候清理foo1调用时候的参数,因为是通过返回进入foo2的,所以foo1的返回地址已经出栈,现在栈里还剩下foo1的两个参数,我们需要第一个参数的位置作为foo2的返回值
// 于是还剩一个参数的位置,foo2也有一个参数,利用__stdcall自己清理参数的特性就可以把剩下的那个参数清理掉。然后我们直接返回到foo1调用后清理参数的代码之后,避免栈混乱。
void __stdcall foo2(void *dummy)
{
printf("foo2...\n当前返回地址: %.8X,位于: %.8X\n", *(&dummy - 1), &dummy - 1);

*(int *)(&dummy - 1) = (int)foo + 0x3A; // 这里的0x3A只有编译后看生成的汇编才能得到。

printf("替换返回地址为foo1返回并清理堆栈后...\n当前返回地址: %.8X,位于: %.8X\n", *(&dummy - 1), &dummy - 1);
}

void foo1(int in_offset, int in_data)
{
int buf[0x10];

printf("foo1...\n当前返回地址: %.8X,位于: %.8X\n", *((void **)&in_offset - 1), (void **)&in_offset - 1);