文章目录
一、整数溢出
整数表示
原码、反码、补码表示:
对于正数原码、反码以及补码是其本身。负数的原码是其本身,反码是对原码除符号位之外的各位取反,补码则是反码加1。
CF是无符号溢出标志,OF是有符号溢出标志。即使有符号数相加/相减导致了CF=1也没什么意义,不能说明结果的正确与否。此时,OF=1,则说明结果溢出,出现错误;OF=0,说明结果正确。这个过程根本和CF没关系,CF=1/0,都不会影响。
这说明指针类型不同,对一个数字的“解读”也不同。
举例
类型转换导致溢出
没注意上界
溢出导致死循环
补码范围问题
返回本身。。。。
也许导致缓冲区溢出
防护
- IntScope
- IntPatch 检测并修复后续的缓冲区溢出
二、格式化字符串漏洞
栈在从高往低增长时,压栈顺序是 输入实参(从右往左) 返回地址RA EBP 局部变量(按顺序)
入栈时先放 格式化字符串的地址(图上当做arg1),然后放实参地址
printf()只根据format打印格式%的数目来依次显示堆栈中format参数后面地址的内容,每次移动一个字(4字节)。
输入的是“hello world” ,打印正常;如果想要打印的字符串中刚好有“%d”,“%x”之类的格式化字符,那么一个变量的参数值就从堆栈中取出。
后面没跟参数,但printf以为后面有个参数,就会把当前堆栈对应的4字节(应该是高地址)以%x打印。通过特定设计,可以打印特定位置内存信息。
那如果是%s呢,可以读任意内存长度了(从低字节到高字节)
如果是%n呢
三、数组越界访问漏洞
溢出与越界不完全相等,数组越界分为读/写两种情况,而溢出漏洞属于越界写入
一些溢出漏洞的本质是数组越界。
产生
举例
**CVE-2014-0160“OpenSSL数组越界访问漏洞”(Heartbleed心脏滴血) **