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

时间:2014-12-09 14:39:19

标签: c buffer-overrun

Used Compiler:GCC 3.4.4 操作系统:Windows 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 \r\n");
    else
        printf("wrong password, %s \r\n", argv[1]);

    return 0;
}

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

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

如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:0)

答案简短:不可能

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

This link is maybe also helpful.