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

详细要求: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);

buf[in_offset] = in_data; // 这里buf + in_offset指向的是foo1的返回地址,foo1返回的时候会跳转的foo2的入口

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

void foo()
{
printf("foo...\n调用foo1, 通过非法索引将foo1返回地址替换为foo2人口...\n");

foo1(18, (int)foo2); // 这里的18是返回地址相对buf的偏移量,只有编译之后才能获得。VC环境下Debug模式是16个buf元素+1个保护数据+1个过去的帧指针。
}

void main()
{
foo();
}
温馨提示:内容为网友见解,仅供参考
无其他回答

缓冲区溢出 是什么意思?原理性讲解下
第一个缓冲区溢出攻击--Morris蠕虫,发生在十年前,它曾造成了全世界6000多台网络服务器瘫痪。1.概念缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是 程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的...

缓冲区溢出攻击危害
缓冲区溢出攻击是一种严重的网络安全威胁,其核心原理是利用程序设计中的漏洞,使得数据超出预定的内存区域,进而控制程序的执行流程。这种攻击手段具有极大的破坏性,攻击者可以借此执行未经授权的指令,甚至窃取系统的控制权,实施非法操作。这一攻击方式有多种英文名称,如buffer overflow、buffer overrun、sma...

如何解决buffer overrun 的问题?
解决缓冲区溢出(bufferoverrun)问题,关键在于理解其本质与影响。缓冲区是程序内部临时存储数据的空间,其大小预先由程序或操作系统设定。当程序向缓冲区写入数据量超过预设大小时,就会发生缓冲区溢出。攻击者常利用这一弱点,实施病毒或特洛伊木马攻击,旨在破坏文件、篡改数据、泄露敏感信息、创建后门访问点...

什么叫“缓冲区益出保护”啊?我的机器这几天总出现这个问题???_百度...
指的是一种系统攻击的手段,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。 造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。 2.制造缓冲区溢出 ~~~ 一个程序在内...

电脑运行过程中 偶尔会出现写有buffer overrun detected 框 是怎么...
buffer overrun detected意思是:缓冲区溢出检测 自已留一下是哪个程序运行时出现问题,将该程序卸载重装。工具-》internet选项-》高级-》还原高级设置 , 重置

防病毒技术的基本信息
缓冲区溢出(buffer overrun)是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用...

...键盘不能在搜索框里打字,并出现BUFFER OVERRUN DETECTED。求助_百度...
1、开放程序时仔细检查溢出情况,不允许数据溢出缓冲区。由于编程和编程语言的原因,这非常困难,而且不适合大量已经在使用的程序;2、使用检查堆栈溢出的编译器或者在程序中加入某些记号,以便程序运行时确认禁止黑客有意造成的溢出。问题是无法针对已有程序,对新程序来讲,需要修改编译器;3、经常检查你的...

(STACK_OVERFLOW)是什么意思?
stack overflow (堆栈溢出)栈溢出(又称缓冲区溢出)攻击是最常用的黑客技术之一。我们知道,UNIX本身以及其上的许多应用程序都是用C语言编写的,C语言不检查缓冲区的边界。在某些情况下,如果用户输入的数据长度超过应用程序给定的缓冲区,就会覆盖其他数据区。这称作“堆栈溢出或缓冲溢出”。一般情况下,...

硬件防毒技术的工作原理
缓冲区溢出(buffer overrun)是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用...

CPU的硬件防毒是怎么个防法?
CPU内嵌的防病毒技术是一种硬件防病毒技术,与操作系统相配合,可以防范大部分针对缓冲区溢出(buffer overrun)漏洞的攻击(大部分是病毒)。Intel的防病毒技术是EDB(Excute Disable Bit),AMD的防病毒技术是EVP(Ehanced Virus Protection),但不管叫什么,它们的原理都是大同小异的。严格来说,目前...

相似回答