缓存区溢出的基本原理

缓存区溢出是由于当被被溢出程序/系统调用类似于read()、sprintf()\strcpy()等函数时向程序的内存空间中写入字符串,一般程序会将其放入堆或栈数据结构中 。若其对写入数据大小没有严格限制,则可能引起数据覆盖函数调用时压栈的esp栈顶指针及eip返回值,通过精心设计的写入数据,可以控制其返回值从而达到夺取控制权的效果。

由于我们的程序是以字符串的形式写入内存,所以 应避免空字符00的出现(函数会将其识别为结束字符串‘\0’,从而将我们构造的shellcode从中间截断。)但有时我们的shellcode需要使用字符串,就需要使用空字符作为字符串的结尾。可用的方案之一为不直接储存空字符,而是在夺取控制权之后通过汇编语句创造空字符,给字符串加上一个结尾。例如

Xor eax,eax

Mov  [指向结尾的指针],al

posted @ 2015-02-04 13:40  o-i  阅读(1108)  评论(0编辑  收藏  举报