buffer overflow

1.
内存泄露(memory leak)
是指程序在申请内存后,无法释放已申请的内存空间,
例:栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢
CVE-2017-12163


内存溢出(out of memory)
是指程序在申请内存时,没有足够的内存空间供其使用。
即你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。
例:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

2.
1) buffer overflow
攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。在某些情况下,这些过量的
字符能够作为“可执行”代码来运行。从而使得攻击者可以不受安全措施的约束来控制被攻击的计算机。

超过的那部分字符将会覆盖与数组相邻的其他变量的空间,使变量出现不可预料的值

如果碰巧,数组与子程序的返回地址邻近时,便有可能由于超出的一部分字符串覆盖了子程序的返回地址,
而使得子程序执行完毕返回时转向了另一个无法预料的地址,使程序的执行流程发生了错误。

堆:堆是一种全局的数据结构,用以动态管理系统内存,
栈:栈也是一种动态的内存结构,但是栈并不是人工分配用以存储数据的,而是由系统自动分配的
C语言当中,在函数当中的局部变量就是存在函数的栈当中,是自动分配的,
而使用malloc函数,calloc函数等进行分配的内存则位于堆空间,是我们向系统“索取”的内存空间

2) 实例 http://blog.nsfocus.net/exim-cve-2018-6789/
概述:
该漏洞源于base64解码函数中的一个缓冲区溢出问题。常规下base64编码的字符串的长度为4的倍数,
但是有可能在传输或者恶意构造的情况下导致长度不为4的倍数,致使长度计算错误。通过该漏洞,
攻击者可以绕过防护机制在受影响的应用程序上下文中执行任意代码。若攻击尝试失败仍可导致拒绝服务。

漏洞成因:
int len = Ustrlen(code)
result = store_get((len/4) * 3 + 1);
result = store_get((len/4) * 3 + len%4 + 1);

base64解码函数用来分配缓冲区长度,一般正常的base64编码数据为 4n,即 len%4 恒为0,
但如果输入无效的base64字符串比如长度为4n+3,就会多分配3个字节,导致溢出

 

dnsmasq dhcp httpd openssh
systemd ntp glibc

 

posted @ 2018-03-10 16:13  Hsinwang  阅读(456)  评论(0编辑  收藏  举报