C-平常所说的栈溢出攻击是什么?是如何攻击的?

C-平常所说的栈溢出攻击是什么?是如何攻击的?

虐人心 发布于 2017-02-21 字数 55 浏览 1147 回复 3

如题,平常所说的栈溢出攻击是什么?是如何攻击的?

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

晚风撩人 2017-10-24 3 楼

举个例子来说明,例如如下代码

void f()
{
char buf[4];
gets(buf);//用来获取输入的字符串
}

gets函数是用来获取输入字符串,因为buf只有4字节长,但是gets函数内部实现并没有对对buf进行检查,所以无论输入几个字节,都会在buf指定的地址存储。栈的调用情况如下图所示

从红色字下方为函数f的栈帧,从中可以看到,存储buf的区域只有4个字节(因为 char buf[4]),这就导致了一个问题就是,如果输入的字节大于4个,就会破坏ebx的内容,大于8字节,则会破坏ebp的内容,大于12自己就会破坏调用者的返回地址,也就是在这里,可以将返回地址替换为攻击者自己的函数地址,然后程序就会跳转到攻击者的函数中了。这也就是栈溢出攻击的原理。

偏爱自由 2017-09-23 2 楼

简单说就是破坏了栈的返回地址。举例如下:

void foo(char* s)
{
char a[10];
strcpy(a,str);
}

加入起调用方式为foo("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/0x20/0x32/0x45/0x67");在做strcpy的时候,因为s的长度大于a,而a存在于栈上,再加上strcpy函数属于直接拷贝的方式,结果是就s将超出a的范围,由于在函数调用的时候压栈顺序是:返回地址,参数,函数局部变量这样的方式;他们的地址是逆序的,返回地址(如0x1234)高于局部变量地址(例中的变量a),这样s copy到a中时,有可能会改写掉这个返回地址,将返回地址跳转到s的实参中的某个位置,而该位置刚好是你构造好的一段代码。这样foo函数执行完之后会执行你构造的代码上去而不是继续向下执行。
在真正实现一次栈攻击的时候关键在于这个参数怎么构造,在哪个位置修改返回地址,哪个位置插入你的攻击代码等因素,一般来说在执行完你的代码之后还要考虑怎样让程序继续执行foo之后的代码或者让用户看到程序属于正常退出等等,这样来隐藏你的攻击。
上面的例子只是一个说明,并不一个可用的实例。其中/0x20/0x32/0x45/0x67一般是汇编之后的二进制代码和返回地址的位置。
另外,在vc现在的环境下,已经内置的防止栈攻击的机制,大概就是在函数调用前对返回地址进行一次计算并存储,等函数调用完了要返回时还要计算一次并与前面的值比较,不相等程序自动崩溃或剖出异常。

浮生未歇 2017-04-01 1 楼

栈溢出Stack Overflow是在网络与分布式系统中被广泛利用的一种漏洞类型。在汇编中以线程为线索的指令执行对函数的调用及局部变量的存取是依靠栈来实现的黑客可以使用特定的脚本语言通过网络远程向对外提供业务的服务器进行攻击利用对栈中数据的填充越界实现有效的漏洞攻击。链接中有详细描述:http://wenku.baidu.com/view/7769c5dfd15abe23482f4df5.html