快捷搜索:  网络  后门  扫描  渗透  CVE  木马  黑客  as

源码审计之缓冲区溢出漏洞

缓冲区溢出算是安全界常见的漏洞,也是一种最初级的漏洞,然则这类漏洞时至今日依旧层出不穷。大部分由于项目庞大,调用逻辑层次复杂,和测试时测试用例问题,不能及时发现这种漏洞。

一. 缓冲区溢出的缘故起因。

由于缓冲区溢出而使得有效的存储单元被改写,往往会诱发不可预料的后果。程序在运行过程中,为了暂且存取数据的需要,黑客技术,一般都要调配一些内存空间,通常称这些空间为缓冲区。要是向缓冲区中写入超过其本身长度的数据,乃至于缓冲区没法容纳,就会造成缓冲区以外的存储单元被改写,这类征象就称为缓冲区溢出。缓冲区长度一般与用户本人定义的缓冲变量的类型有关。

总结以上缘故起因,可以获得缓冲区溢出的两个必要前提。

1. 缓冲区。

2. 对缓冲区操作造成缓冲区外的存储单元的数据被改写。

找到缘故起因后可以总结代码中出现的情形。

缓冲区: 数组,malloc/new 申请, struct以及class中数组。 

写入操作:对缓冲写入操作时,没有对长度做校验,导致数据被笼盖改写。(strcpy,strcat,scanf,memcpy, me妹妹ove, memeccpy Getc(),fgetc(),getchar;read,printf等函数)。

二. 常见的代码审计工具缺陷

代码审计对复杂项目的审计结果不好:

1.函数调用是个复杂的过程,当审计工具找到敏感函数时,归溯函数的调用路径常常会遇到难题。

2. 要是程序使用了复杂框架,代码审计工具往往由于缺乏对框架的支持,从而造成误报或漏报。

三. 源码中白盒审计阐发

本次审计的开源软件为Dmitry1.3a(源码自行下载).用到的工具sourceinsight,gdb,peda。

使用sourceinsight对源码进行解析。

1. 查找所有容易产生溢出的函数调用点。

是否对长度有控制,有控制需要查看控制是否合理,分歧理可能会引起溢出。没有长度控制是很大隐患点。

使用sourceinsgiht可以在工程所有文件中查找容易引起溢出的函数的代码以及文件。 

逐一查看函数调用是否安全

2. 逐一阐发是否存在可能溢出

溢出缘故起因对缓冲区操作时没有对缓冲区空间的大小进行校验。

要是使函数的参数,需要查找其调用函数,查看实参参入时长度是否以及函数体内长度一致。要是小于实参长度,就容易产生溢出。

找到可疑点,并做记录。

可疑点1.

源码审计之缓冲区溢出漏洞

可疑点2:

源码审计之缓冲区溢出漏洞

可疑点3:函数内部定义fhost最大值为128

源码审计之缓冲区溢出漏洞

然则main函数内部调用时没有检查长度。

源码审计之缓冲区溢出漏洞

可疑点4:函数内部定义为hostwww最大长度为64.

源码审计之缓冲区溢出漏洞

然则调用函数main内里。

源码审计之缓冲区溢出漏洞

可疑点5:

源码审计之缓冲区溢出漏洞

然则调用函数main内里:

源码审计之缓冲区溢出漏洞

可疑点6:

源码审计之缓冲区溢出漏洞

在main函数内里调用,参数strings被输入时没有长度验证。

源码审计之缓冲区溢出漏洞

四. 验证可疑点

对源代码做了白盒设计阐发后,需要对程序的流程以及数据做验证阐发,输入诱发溢出的数据,查看是否能够引起溢出。

验证可疑点1:

使用gdb调试程序。

配置其参数:set args -oBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB  aaaaaaaaaaaaaaa(-o选项,当optorg != 最后一个参数的时辰)执行strcpy(outputfile,optarg);  其中outputfile[64]。参数中104个B。可以诱发溢出。

运行查看效果:

源码审计之缓冲区溢出漏洞

可以看到outputfile被写入BBB,超过了64位的长度。   然则没有诱发异常。

查看outputfile的定义,是一个全局变量,被写入超长数据笼盖一部分数据,数据并没有使用,所以没有诱发异常。

源码审计之缓冲区溢出漏洞

验证可疑点2:

Gdb调试,配置配置参数,使参数超过128个字符即可产生溢出。在strcpy(host_name,argv[argc - 1]);处下断点。

set argsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

断下后,查看未执行strcpy前host_name的数据。

源码审计之缓冲区溢出漏洞

执行后,查看host_name的数据。

源码审计之缓冲区溢出漏洞

可以看到数据被笼盖,超过了128.  查看寄存器,大部分寄存器都被笼盖为

源码审计之缓冲区溢出漏洞

验证可疑点3:

参数长度计算

源码审计之缓冲区溢出漏洞

超过128+128+64的长度才能笼盖数据,诱发溢出。

源码审计之缓冲区溢出漏洞

验证可疑点4:

查看诱发溢出的前提

源码审计之缓冲区溢出漏洞

只有输入长度大于64+128+4+4+4+4+4后的长度才能诱发异常。但不能超过可疑点3的长度。

超过后会诱发可疑点3.

配置参数:

set args AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

源码审计之缓冲区溢出漏洞

可疑点5以及可疑点4类似,输入数据容易诱发可疑点3以及可疑点4的溢出。略过。

 验证可疑点6:

配置运行参数:

set args -o AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

跟踪到函数中,执行完strcat(sendbuff, string2),可以看到数据被笼盖。

源码审计之缓冲区溢出漏洞

源码审计之缓冲区溢出漏洞

五. 总结

本次缓冲区溢出首要讲解的是栈溢出。纯手工审计是为了熬炼本人在代码审计时对漏洞的敏感度。本次用到的Dmitry1.3a是一款信息挖掘的工具。人人在审计或者渗透排泄时用到工具要是是开源的,可以对源码进行审计以及阐发,可以同时提高审计能力以及工具完成的道理。

*:,,。

您可能还会对下面的文章感兴趣: