败,在内存回收操作中,合并相邻空闲块重新插入双向链表时会有一个写4字节内存的操作,如果弱点程序由于编程错误free()一个不存在的块,就可以精心伪造这个块,从而覆盖任何想要的值:函数的返回地址、库函数的plt地址等。
例如,通过覆盖Wi
dows系统中异常处理链SEH来实现的(如图2所示)。在Wi
dows系统中,当发生异常时,系统就会查找异常处理链SEH,找应对这种异常的处理程序,找到了对应的处理程序后,就把保存的处理程序的地址赋给EIP,这样系统就会执行处理程序,以避免系统崩溃。
在Wi
dows系统中,SEH链保存在堆栈中。所以这种SEH覆盖方式,就是将顶层SEH中的指向下一节点的值覆盖成JMP04,而处理程序的地址覆盖成callebx的地址,后面再跟上shellcode。这样出错后,Wi
dows就会跳转到处理程序中,执行callebxt,进入前面的jmp04中,再执行jmp04就正好跳过覆盖的地址,到达shellcode处(如图3所示)。
3)格式化字符串漏洞(formatstri
gvul
erability)
如果输入的字符串格式由用户定制,攻击者就可以伪造任意格式串,利用pri
tf()系列函数的特性就可以窥探堆栈空间的内容,超常输入可以引发传统的缓冲区溢出,或是用“
”覆盖指针、返回地址等。
例如:打印输出一个字符串或者把这个串拷贝到某缓冲区内。写出如下的代码:
pri
tf