1.原理:
在main函数之前,会调用__security_init_cookie函数(win10,vs2017,release,x86);
进入__security_init_cookie函数内部:
__security_cookie(随机数,产生于ntdll.dll的函数,通过栈回溯,下.data+4的硬件断点,可以追踪,看的我头疼,不想弄)
存在当前程序.data段的第4个字节,并将它按位取反,放入了.data的第0个字节。
进入main函数:
从.data+4的位置把__security_cookie取出来与当前栈的esp进行异或,得到的结果放入[ebp-4](这个位置不是固定的,不过都距离栈底较近)
当函数返回之前:
将[ebp-4]中的数据取出来,与esp异或,比较得到的结果与[.data+4]中的数据是否一致,来判断[ebp-4]的位置是否被修改过。
2.GS的优点与缺陷(不考虑DEP,ALSR,优化等)(源于<<0day安全>>)
①修改栈帧中函数返回地址的经典攻击将被 GS 机制有效遏制;
② 基于改写函数指针的攻击,如 C++虚函数的攻击,GS 机制仍然很 难防御;
③ 针对异常处理机制的攻击,GS 很难防御;
④GS 是对栈帧的保护机制,因此很难防御堆溢出的攻击。
3.方法
可以修改.data+4的数据(如果可以的话),人工计算向栈内填值,骗过__security_check_cookie函数