搜索

漫谈空指针漏洞防护技术(初级篇)

2025-1-8 11:27| 发布者: admin| 查看: 167| 评论: 0



3.2源码级验证

接下来就结合两个小的实验例子看看空指针,及使用空指针的后果。

3.2.1指针使用前期对比

本例是要验证指针变量在初始化前后的状况,下图是一段代码:

漫谈空指针漏洞防护技术(初级篇)

代码很简单只是验证指针变量在赋值与未赋值分别指向的空间。代码中要打印的值:

指针变量初始化之前的地址 指针变量初始化之前的值 指针变量初始化之后的地址 指针变量初始化之后的值

编译之后,运行三次程序看运行的结果:

漫谈空指针漏洞防护技术(初级篇)

从三次运行结果来看:

每次打印指针变量的地址都不同,因为每次运行程序,P指针变量的地址都在变动。 同一次打印中指针变量在初始化之前与初始化之后的地址没有变化。因为指针变量也是变量,变量在其生命周期中值可以变动,但是地址不会改变。 每次打印中指针变量在初始化之前的值发生了变化。指针变量的值本身也是指向一块内存地址,在初始化之前该变量不指向任何内存地址,所以该变量的值就是一个随机值(也就是指向随机内存地址)。 每次打印中指针变量在初始化之后的值没有发生变化,在指针变量初始化之后P=0,所以在内存初始化的指针变量指向了内存地址都为0×00000000的位置。在每次打印中指针变量在初始化之后的值就不会发生变化。

3.2.2指针使用后期对比

针对指针变量在使用完毕后,内存释放之后的情况对比,其源码如下:

漫谈空指针漏洞防护技术(初级篇)

代码没什么复杂逻辑,只是想验证一下在指针变量释放后, P=NULL之前的野指针与P=NULL之后的指针状况,打印的内容:

指针变量P开始的地址与值 指针变量P在分配内存空间之后的地址与值 指针变量P在释放内存空间之后的地址与值 指针变量P在P=NULL之后的地址与值

下图是在编译之后运行的结果:

漫谈空指针漏洞防护技术(初级篇)

a. 指针变量在声明之后一直到最后的程序结束,指针变量的地址一直没有变动为0x35f778。 b. 定义指针变量时其值为0×00000000 c. 在申请新的内存之后,指针变量的值为申请内存的地址0x6e7a78 d. 在内存释放后,P变成野指针,但是此时P的值仍然是申请的内存地址0x6e7a78,但是此时P指针已经不能再使用。 e. 在P=NULL,p重新指向了地址0×00000000处。

由此可见,我们在释放指针变量后,指针变量会变成野指针,如果此时引用该指针会出现非法访问,因此需要在释放指针变量后将指针变量指向空。

3.3可视化内存验证

为了能够更加直观的查看指针变量在内存中的变化,下面就结合动态调试的技术看看指针变量在整个使用过程中的变化情况。下面是一段程序代码:

漫谈空指针漏洞防护技术(初级篇)

在这里,我们使用OD动态调试器,来看看调用printf函数的情况:

a. 第一条打印语句

printf("p address :%p, value :%08x\n", &p, p);

在调用printf前其内存情况:

漫谈空指针漏洞防护技术(初级篇)

可知指针变量P的值为EAX=[EBP-4],P的地址ECX=EBP-4,此时的寄存器值:

漫谈空指针漏洞防护技术(初级篇)

调用printf之后的值刚好是这两个值

漫谈空指针漏洞防护技术(初级篇)

b.第二条打印语句printf(“p intialized address :%p, value :%08x\n”, &p, p);在调用printf前其内存情况:

漫谈空指针漏洞防护技术(初级篇)

可知指针变量P的值为EDX=[EBP-4],P的地址EAX=EBP-4,此时的寄存器值:

漫谈空指针漏洞防护技术(初级篇)

调用printf之后的值刚好是这两个值:

漫谈空指针漏洞防护技术(初级篇)

c. 第三条打印语句printf(“p free address :%p, value :%08x\n”, &p, p);在调用printf前其内存情况:

漫谈空指针漏洞防护技术(初级篇)

可知指针变量P的值为EAX=[EBP-4],P的地址ECX=EBP-4,此时的寄存器值:

漫谈空指针漏洞防护技术(初级篇)

调用printf之后的值刚好是这两个值:

漫谈空指针漏洞防护技术(初级篇)

d. 第四条打印语句printf(“p ultimate address :%p, value :%08x\n”, &p, p);在调用printf前其内存情况:

漫谈空指针漏洞防护技术(初级篇)

可知指针变量P的值为EDX=[EBP-4],P的地址EAX=EBP-4,此时的寄存器值:

漫谈空指针漏洞防护技术(初级篇)

调用printf之后的值刚好是这两个值:

漫谈空指针漏洞防护技术(初级篇)

3.4 概念总结之空指针漏洞

前面对什么是空指针,什么是野指针做了讲解和验证。

在编程领域的空指针是指向NULL的指针,也就是说指向零页内存的指针叫空指针。对于未初始化的指针,释放内存而未将指针置为NULL和指针指向超出范围的情况称为野指针。那么在第二节中列举的空指针漏洞及未列举的空指针漏洞是不是都是由于引用零页内存导致的呢(比如CVE-2014-2678)?其实不然,有些漏洞是由于引用未初始化的指针或是引用超出范围的指针所导致,而这类漏洞应该说是由于错误的引用了野指针。比如最新的BIND漏洞(CVE-2015-5477):

漫谈空指针漏洞防护技术(初级篇)

但是到目前为止还没用听说过哪个漏洞命名为野指针漏洞,而更多的是空指针漏洞。也就是说在计算机安全领域中由空指针或是野指针导致的漏洞统一叫做空指针漏洞。

12

鲜花

握手

雷人

路过

鸡蛋
返回顶部