1.什么是缓冲区溢出漏洞?

2.什么是栈溢出?栈溢出漏洞如何利用?

3.什么是堆溢出?堆溢出漏洞如何利用?

4.什么是格式化字符串漏洞?该漏洞如何利用?

5.针对缓冲区溢出漏洞,Windows平台设置了哪些保护机制?

1.什么是缓冲区溢出漏洞?

(1)进程的内存使用划分

进程在内存的具体组织形式依赖于操作系统、编译器、链接器以及载入器。进程在内存中的通用组织形式、在UNIX和Win32上可能的组织形式如图所示。

缓冲区
程序中所使用的缓冲区可以是堆区和栈区,也可以是存放静态变量的数据区。
由于进程中各个区域都有自己的用途,根据缓冲区利用的方法和缓冲区在内存中所属区域,其可分为栈溢出和堆溢出。

缓冲区溢出漏洞
缓冲区溢出漏洞就是在向缓冲区写入数据时,由于没有做边界检查,导致写入缓冲区的数据超过预先分配的边界,从而使溢出数据覆盖在合法数据上而引起系统异常的一种现象。
目前,缓冲区溢出漏洞普遍存在于各种操作系统(Windows、Linux、Solaris、Free BSD、HP-UX以及IBM AIX),以及运行在操作系统上的各类应用程序中。

2.什么是栈溢出?栈溢出漏洞如何利用?

函数的栈帧
在程序设计中,栈通常指的是一种后进先出的数据结构。
相对于广义的栈而言,栈帧是操作系统为进程中的每个函数调用划分的一个空间,每个栈帧都是一个独立的栈结构,而系统栈则是这些函数调用栈帧的集合。
系统栈由系统自动维护,用于实现高级语言中函数的调用。

函数的栈帧
当函数被调用时,系统会为这个函数开辟一个新的栈帧,并把它压入栈区中,所以正在运行的函数总是在系统栈区的栈顶(本书称为:当前栈帧)。当函数返回时,系统会弹出该函数所对应的栈帧空间。
栈帧的生长方向是从高地址向低地址增长的。

函数的栈帧
ESP:扩展栈指针(Extended Stack Pointer)寄存器,其存放的指针指向当前栈帧的栈顶。
EBP:扩展基址指针(Extended Base Pointer)寄存器,其存放的指针指向当前栈帧的栈底。
显然,ESP与EBP之间的空间即为当前栈帧空间。

函数的栈帧
一个函数栈帧中主要包含如下信息。
1)前一个栈帧的栈底位置,即前栈帧EBP,用于在函数调用结束后恢复主调函数的栈帧(前栈帧的栈顶可计算得到)。
2)该函数的局部变量。
3)函数调用的参数。
4)函数的返回地址RET,用于保存函数调用前指令的位置,以便函数返回时能恢复到调用前的代码区中继续执行指令。

栈溢出漏洞基本原理
栈溢出后修改返回地址RET
栈溢出后修改相邻变量这种漏洞利用对代码环境的要求比较苛刻。更常用的栈溢出修改的目标往往不是某个变量,而是栈帧中的EBP和函数返回地址RET等值。
接下来例3-3演示的是,将一个有效指令地址写入返回地址区域中,这样就可以让CPU跳转到我们希望执行的指令处,从而达到控制程序执行流程的目的。

栈溢出攻击
实际攻击中,攻击者通过缓冲区溢出改写的目标往往不是某一个变量,而是栈帧高地址的EBP和函数的返回地址等值。通过覆盖程序中的函数返回地址和函数指针等值,攻击者可以直接将程序跳转到其预先设定或已经注入到目标程序的代码上去执行。
栈溢出攻击是一种利用栈溢出漏洞所进行的攻击行动,目的在于扰乱具有某些特权运行的程序的功能,使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。

栈溢出攻击
JMP ESP覆盖方法
在实际的漏洞利用中,由于动态链接库的装入和卸载等原因,Windows进程的函数栈帧可能发生移位,即Shellcode在内存中的地址是动态变化的,所以上述采用直接赋地址值的简单方式在以后的运行过程中会出现跳转异常。
可以在覆盖返回地址的时候用系统动态链接库中某条处于高地址且位置固定的跳转指令所在的地址进行覆盖,然后再通过这条跳转指令指向动态变化的Shellcode地址。这样便能够确保程序执行流程在目标系统运行时可以被如期进行。

SEH结构
异常处理结构体SEH是Windows异常处理机制所采用的重要数据结构:
SEH结构体存放在栈中,栈中的多个SEH通过链表指针在栈内由栈顶向栈底串成单向链表;
位于链表最顶端的SEH通过线程环境块TEB-Thread Environment Block)0字节偏移处的指针标识;
每个SEH包含两个DWORD指针:SEH链表指针和异常处理函数句柄,共8个字节。

SEH覆盖方法
SEH覆盖方法就是覆盖异常处理程序地址的一种攻击方式。由于SEH结构存放在栈中,因此攻击者可以利用栈溢出漏洞,设计特定的溢出数据,将SEH中异常函数的入口地址覆盖为Shellcode的起始地址或可以跳转到Shellcode的跳转指令地址,从而导致程序发生异常时,Windows异常处理机制执行的不是预设的异常处理函数,而是Shellcode。

3.什么是堆溢出?堆溢出漏洞如何利用?

堆的基本知识
堆与栈的区别

node—>blink—>flink = node—>flink ;node—>flink—>blink = node—>blink ;

如果我们通过堆溢出覆写了一个空闲堆块的块首的前向指针flink和后向指针blink,构造一个地址和一个数据,当这个空闲堆块从链表里卸下的时候,就获得一次向内存构造的任意地址写入一个任意数据的机会-Arbitrary Dword Reset(又称Dword Shoot)。

基于Dword Shoot攻击,攻击者甚至可以劫持进程,运行植入的恶意代码。比如,当构造的地址为重要函数调用地址、栈帧中函数返回地址、栈帧中SEH的句柄等时,写入的任意数据可能就是恶意代码的入口地址。

Categories:

Tags:

No responses yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注