Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:IF语句未按预期触发_C_Buffer Overflow - Fatal编程技术网

C:IF语句未按预期触发

C:IF语句未按预期触发,c,buffer-overflow,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

我有以下功能。可执行文件运行良好。在程序运行后的提示下,我输入
\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);
    }
}
int play(){
INTA;
int b;
字符缓冲区[010];
a=0x4141;
b=0x4242;
如果(写入(STDOUT_FILENO),“一瞬间,什么也没有发生。然后,大约一秒钟后,什么也没有继续发生。\n>”,91)<0){
佩罗(“书面”);
}
如果(读取(标准数据文件号和缓冲区,0xC)<0){
佩罗(“阅读”);
}
如果(a==31337){
系统(缓冲区);
}
否则如果(b==1337){
readfile(“log.txt”);
}
否则{
printf(“B:0x%08x\n”,B);
}
}
您有两个错误:

行:

应该是

char buffer[0xc]; 
read(STDIN_FILENO, buffer, 0xC)

应该是

char buffer[0xc]; 
read(STDIN_FILENO, buffer, 0xC)
因为您需要指向缓冲区开头的指针

编辑


您还需要在
system

之前向缓冲区添加空字符,因为十进制的
1337
是十六进制的
539
,所以只需在bash中运行以下命令

$ printf 'xxxxxxxx\x39\x05\x00\x00' | ./a.out
buffer
的大小为
010
,即
8
字节,因此它将被
xxxxxxxx
填充,并且由于
b
被分配到堆栈中的
buffer
旁边,因此将
0xC
字节读入
buffer
将泄漏到
b
,并填充
0x39050000
。由于大多数架构都是小端,因此
b
的值将是
0x00000539
,以十进制表示为
1337


也许本地变量在堆栈中的分配方式取决于编译器、体系结构或操作系统,但这似乎是10年前在Linux OS x86上gcc编译的二进制文件的行为。

补充了@ymonad给出的答案

由于必须进行远程操作,他必须
netcat
进入1984端口。所以这应该是必须的答案

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

char缓冲区[010]-8个字符够了吗?提示@EdHeal所说的,请检查数字系统。我假设此练习的目的是创建缓冲区溢出?你已经成为会员很长时间了,问了很多问题,现在我想你应该知道了吧?请编辑您的问题,以澄清目的,以及程序应该如何处理您提供的输入。您为什么删除代码?答案不再有任何意义。您为什么删除代码?这使你的问题变得毫无用处。我认为目的是创建缓冲区溢出,因此缓冲区的大小和OP读取的内容可能是应该的。这假设编译器以特定顺序存储变量