缓冲区溢出提纲

缓冲区溢出简单的来讲分为两种

  • 栈溢出
  • 堆溢出

那么什么是栈什么是堆呢

在这里简单谈一下对于堆和栈的理解 :

: 用来为程序中已经声明的变量来分配内存空间的地址,以及保存函数返回地址的空间,可以用来实现函数的递归调用。

例如 int ,char 这类的定义的数据。

: 在程序运行时动态分配的内存。一般使用一个堆指针来使用得到的内存。堆在使用时需要实用专有的函数进行声明。如C语言的malloc以及C++的new。注意使用完后要回收内存,否则会造成内存泄露。

例如 int *name;
name = (int *)malloc(8);

栈溢出

  • 修改临接变量(变量越界缺陷)

  • 修改函数返回地址"自主控制":
    定位工具:ollydbg.exe
    相对地址选择:kernel32.dll user32.dll

  • S·E·H结构函数: 将异常处理函数入口地址更改为shellcode的地址。

堆溢出

堆的结构(堆区)
  • 堆块 :
  • 块首:8byte,用来存储堆块的信息
  • 块身: 用来存放数据(堆块的指针是直接指向快身的)
  • 堆表 :堆区的起始。 空闲堆块的索引。
    最重要的堆表有两种:
    空表(双向链表)128项。
    块表(一般在缓冲区溢出中不予利用)
堆溢出的利用
  • Dword Shoot:利用堆管理时“卸下”操作。
  • Heap Spray:申请大量内存。slide code → shell code。

你可能感兴趣的:(缓冲区溢出提纲)