内存保护机制及绕过方案——通过覆盖虚函数表绕过/GS机制
1 GS内存保护机制 1.1 GS工作原理 栈中的守护天使--GS,亦称作Stack Canary / Cookie,从VS2003起开始启用(也就说,GS机制是由编译器决定的,跟操作系统无关)。 GS机制分三个步骤:计算随机种子 --> canary写入栈帧 --> GS校验。 [1]程序启动时,读取 .data 的第一个 DWORD 作为基数,然后和各种元素(时间戳,进程ID,线程ID,计数器等等)进行XOR加密 [2]然后将加密后的种子再次写入 .data 的第一个 DWORD [3]函数在执行前,把加密后的种子取出,与当前 esp 进行异或计算,结果存入EBP的前面 [4]函数主体正常执行。 [5]函数返回前(retn前一点),把cookie取出与esp异或计算后,调用security_check_cookie函数进行检查,与.data节里的种子进行比较,如果校验通过,则返回原函数继续执行;如果校验失败,则程序终止。 图解: 1.2 变量重排技术 如图1.1所示,在缓冲区域cookie之间还有一些空隙,这是因为在旧版本(VS2005之前)的编译器里,局部变量是随机摆放的(指针,int,字符串位置随机) 所以这里就还存在一丝安全隐患->_->那就是Buff可能在不压过Cookie的情况下覆盖一些局部变量,所以,后期的编译器就推出了-- 变量重排技术。 如图1-2所示 图 1