初识缓冲区溢出

2021-6-8 杰克 安全

0x00
       缓冲区溢出是计算机安全领域内比较古老的话题,但即使到现在它依然广泛存在于各种应用系统中。由于C/C++语言没有数组越界检查机制,当向局部数组缓冲区里写入的数据超过为其分配的大小时,就会发生缓冲区溢出。而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害是:一种情况是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell

0x01
       下面演示一段代码来说明“溢出”。程序很简单创建2个变量,其中“a”定义为14个字节数组变量。然后用strcpy函数将a1复制到a  最后printf打印变量和用system函数运行。
warnings.png
       理论上来说,因为变量a定义为14个字节。所以只能复制a1的“ping 127.0.0.1”刚好14个字符(含空格)。程序员也希望是这样(黑客除外),然鹅。。。。。。程序使用了不安全的 strcpy 函数。在编译的时候,编译器默认情况下编译是不会通过的,会报4996错误。因为我要演示这个函数,所以关闭了错误提示。但编译器还是会提示警告信息。程序运行后,很快被安全软件发现
exe.png
最后无论是选择允许还是阻止程序都会报错,因为内存溢出了。如果选择允许,报错并不影响恶意代码的执行。
err.png
0x02
       这里演示的只是一个非常简单的情况。程序大多都不是封闭运行的,需要与外界交互。假设这个变量a1是程序接受外部输入的,比如邮件系统的输入或者登陆页面的输入。或者程序员偷懒不想多打“_s”(安全的strcpy_s函数)。于是一个缓冲区溢出漏洞就出现了。不过在实际情况中没有这么多凑巧和典型。缓冲区溢出的利用也远比我这个程序复杂的多,一般都是通过覆盖返回地址,让返回地址指向精心构造的shellcode从而控制系统
buffer.png
0x03
       那么要如何发现程序中存在这样的漏洞呢?前面已经说过程序的缓冲区是可以写入的,而我们要找的就是程序的哪一部分可以用来重写。而反复测试写入的这个过程有个专业术语叫“fuzzing”意即 模糊测试 。大名鼎鼎的metasploit就带这个模块,Kali中有集成。通常做法是发送超大的数据缓冲区给程序,覆盖程序内存的重要部分。在这些缓冲区覆盖程序内存之后,就可以重定向程序的执行流并运行注入代码
metasploit.png
0x04
       虽然缓冲区溢出漏洞广泛存在,但要防范也不难。除了程序代码本身做好越界安全检查机制。同时对操作系统的敏感操作监控,服务器发起的未知网络连接排查等都能有效阻止此类渗透攻击

标签: c/c++ 缓冲区溢出 黑客 渗透

发表评论:

Powered by emlog 京ICP备17037512-1 e-mail:jackhkyin@163.com QQ:393147796