windows中最重要的堆表有两种:空闲双向链表(Freelist)和快速单向链表Lookaside。快表从来不会发生堆块合并。 快表只有在精确匹配时才会分配,而空表有“找零钱”现象。 所有的释放块都链入堆表的末尾,分配的时候也先从堆表末尾拿。 调试态堆管理策略和常规堆管理策略有很大差异。 DWORD SHOOT的常用目标: 内存变量、代码逻辑、函数返回地址、攻击异常处理机制、函数指针、PEB中线程同步函数的入口地址(RtlEnterCriticalSection、RtlLeaveCriticalSection)。 异常处理流程:线程SEH异常处理函数,进程seh处理函数,系统默认异常处理程序(程序崩溃对话框)。 异常处理函数的第一轮调用用来尝试处理异常,第二轮的unwind调用往往执行释放资源等操作。 以下情况不会应用GS: (1)函数不包括缓冲区; (2)函数被定义为具有变量参数列表; (3)函数使用无保护的关键字标记; (4)函数在第一个语句中包含内嵌汇编代码; (5)缓冲区不是8字节类型且大小不大于4个字节。 突破GS: 利用未被保护的内存 覆盖虚函数 攻击异常处理 同时替换栈中和.data中的cookie SafeSEH RtlIsValidHandler函数在以下情况允许异常处理函数执行: (1)异常处理函数位于加载模块内存范围之外,DEP关闭。 (2)异常处理函数位于加载模块内存范围之内,相应模块未启用SafeSEH(安全SEH表为空),同时相应模块不是纯IL。 ...