使用旧的C / C++编译器开发的黑客程序



使用的编译器:GCC 3.4.4操作系统: 视窗 XP 32 位

使用较旧的C/C++编译器(例如gcc 3.4或Visual Studio 6(,可以操纵堆栈帧以操纵程序执行(例如,通过损坏的返回地址(并出现缓冲区溢出。

尝试显示这一点失败了,因为我需要复制的所有数据都包含一个零字节,复制总是停止。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int checkauth(char *password)
{
    int authflag = 0;
    char passwordbuffer[10] = "aaaaaaa";

    strcpy(passwordbuffer, password);
    if(strcmp(passwordbuffer, "password")==0)
        authflag = 1;
    return authflag;
}
int main (int argc, char *argv[])
{
    int authflag = 0;
    char password[10] = "bbbbb";
    if (argc < 2)
    {
        printf("Password missing");
        exit(0);
    }
    authflag = checkauth(argv[1]);
    if(authflag > 0)
        printf(" password ok rn");
    else
        printf("wrong password, %s rn", argv[1]);
    return 0;
}

如代码所示,我使用命令行参数来填充缓冲区。这始终在第一个空白处停止。我搜索了几个例子(书:黑客 - 利用的艺术,堆栈溢出......(,但所有地址都不包含零字节。在这种情况下,问题取决于保存在返回地址前面的内存中的堆栈指针(地址包括零字节(,如果堆栈指针没有一些有效值,程序总是失败。

如果0x004013b1,我想跳到的地址将是0x004013BA。保存的堆栈指针获取值0x0022ff78。这意味着我需要用 43 字节的随机内容以及堆栈指针和返回地址填充缓冲区。

如何解决这个问题?

谢谢

简短的回答:这是不可能的

这背后的原因是 c 字符串以 null 结尾。如果读取0x00,该函数strcpy停止复制。该特性也用于一些缓冲区溢出保护功能,如ASCII-armor ASLR(RedHat Exec-Shield(。

此链接可能也有帮助。

最新更新