什么是溢出?
正数加正数,不可能等于一个负数,如果出现了,就是溢出。负数加负数,也不可能等于一个正数,如果出现了就是溢出。溢出的概念,只发生在有符号数。无符号数,是没有溢出这个概念的。
于是,这就涉及到了,有符号数的大小判断。因为CMP,作的是目的操作数,减去源操作数的一个减法运算。试想一下,如果目的操作数,是一个正数,而源操作数,是一个负数。那么,正数减去负数,就相当于正数加正数。
有符号数,正数的最高位,是0。但是,两个正数相加,最高位,可能溢出,变成了1。这不就出现了负数了吗。
从,目的操作数,与源操作数的符号(正负),可知,目的操作数为正数,肯定大于负数。结果为,">“,大于。
发生了溢出之后,OF=1。但SF=1(负数)。此时,OF=SF,所以是大于。
缓冲区溢出(Buffer overflow)
编写程序时没有考虑到控制或者错误控制用户输入的长度,本质就是向定长的缓冲区中写入了超长的数据,造成超出的数据覆写了合法内存区域
栈溢出(Stack overflow)
是最常见,漏洞比列最高,危害最大的二进制漏洞
在CTF PWN中往往是漏洞利用的基础
比如:
int overflow()
{char buf[8]; read(0,buf,16)
}
char buf[8];
#定义了一个char类型的个数位8的变量,所以缓冲区长度位8,
read(0,buf,16)
#但是向buf read了一个16的内容
堆溢出(Heap overflow)
堆管理器复杂,利用花样繁多
CTF PWN中的常见题型
Data段溢出(比如bss段,比较少见)
攻击效果依赖于Data段 上存放了何种控制数据
注:总结于星盟安全团队CTF-PWN课程