缓存区溢出的基本原理
缓存区溢出是由于当被被溢出程序/系统调用类似于read()、sprintf()\strcpy()等函数时向程序的内存空间中写入字符串,一般程序会将其放入堆或栈数据结构中 。若其对写入数据大小没有严格限制,则可能引起数据覆盖函数调用时压栈的esp栈顶指针及eip返回值,通过精心设计的写入数据,可以控制其返回值从而达到夺取控制权的效果。
由于我们的程序是以字符串的形式写入内存,所以 应避免空字符00的出现(函数会将其识别为结束字符串‘\0’,从而将我们构造的shellcode从中间截断。)但有时我们的shellcode需要使用字符串,就需要使用空字符作为字符串的结尾。可用的方案之一为不直接储存空字符,而是在夺取控制权之后通过汇编语句创造空字符,给字符串加上一个结尾。例如
Xor eax,eax
Mov [指向结尾的指针],al