【软件与系统安全】整数溢出、格式化字符串、数组越界访问漏洞

一、整数溢出

整数表示

在这里插入图片描述
原码、反码、补码表示:
在这里插入图片描述
对于正数原码、反码以及补码是其本身。负数的原码是其本身,反码是对原码除符号位之外的各位取反,补码则是反码加1。
在这里插入图片描述
CF是无符号溢出标志,OF是有符号溢出标志。即使有符号数相加/相减导致了CF=1也没什么意义,不能说明结果的正确与否。此时,OF=1,则说明结果溢出,出现错误;OF=0,说明结果正确。这个过程根本和CF没关系,CF=1/0,都不会影响。

这说明指针类型不同,对一个数字的“解读”也不同。

举例

类型转换导致溢出
在这里插入图片描述
没注意上界
在这里插入图片描述
溢出导致死循环
在这里插入图片描述
补码范围问题
在这里插入图片描述
返回本身。。。。
也许导致缓冲区溢出
在这里插入图片描述

防护

  1. IntScope
    在这里插入图片描述
  2. IntPatch 检测并修复后续的缓冲区溢出

二、格式化字符串漏洞

在这里插入图片描述
栈在从高往低增长时,压栈顺序是 输入实参(从右往左) 返回地址RA EBP 局部变量(按顺序)
入栈时先放 格式化字符串的地址(图上当做arg1),然后放实参地址
printf()只根据format打印格式%的数目来依次显示堆栈中format参数后面地址的内容,每次移动一个字(4字节)。
在这里插入图片描述
输入的是“hello world” ,打印正常;如果想要打印的字符串中刚好有“%d”,“%x”之类的格式化字符,那么一个变量的参数值就从堆栈中取出。
后面没跟参数,但printf以为后面有个参数,就会把当前堆栈对应的4字节(应该是高地址)以%x打印。通过特定设计,可以打印特定位置内存信息。
在这里插入图片描述

在这里插入图片描述
那如果是%s呢,可以读任意内存长度了(从低字节到高字节)

在这里插入图片描述
如果是%n呢
在这里插入图片描述

三、数组越界访问漏洞

溢出与越界不完全相等,数组越界分为读/写两种情况,而溢出漏洞属于越界写入
一些溢出漏洞的本质是数组越界。

产生

在这里插入图片描述

举例

**CVE-2014-0160“OpenSSL数组越界访问漏洞”(Heartbleed心脏滴血) **
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39679772/article/details/124890705
今日推荐