Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++ 我不能使缓冲区溢出_C++_Buffer Overflow - Fatal编程技术网

C++ 我不能使缓冲区溢出

C++ 我不能使缓冲区溢出,c++,buffer-overflow,C++,Buffer Overflow,我看到了一个缓冲区溢出代码,但我不能让它溢出。有任何gcc选项来编译它吗?或者那个密码有什么问题 代码是: #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> int main(int argc, char **argv) { volatile int modified; char buffer[64]; if

我看到了一个缓冲区溢出代码,但我不能让它溢出。有任何gcc选项来编译它吗?或者那个密码有什么问题

代码是:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
     volatile int modified;
     char buffer[64];

     if(argc == 1) {
          errx(1, "please specify an argument\n");
     }

     modified = 0;
     strcpy(buffer, argv[1]);

     if(modified == 0x61626364) {
            printf("you have correctly got the variable to the right value\n");
     } else {
            printf("Try again, you got 0x%08x\n", modified);
     }
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
挥发性int修饰;
字符缓冲区[64];
如果(argc==1){
errx(1,“请指定一个参数\n”);
}
修改=0;
strcpy(缓冲区,argv[1]);
如果(修改==0x61626364){
printf(“您已将变量正确设置为正确的值\n”);
}否则{
printf(“重试,您得到0x%08x\n”,已修改);
}
}
我试着这样运行:
perl-e'print“A”x64。“dcba”| xargs./main

您需要知道

  • 了解堆栈内存布局以及变量
    modified
    buffer
    您可以通过将“修改”和“缓冲区”之间的偏移量作为
    (char*)和“修改的-(char*)缓冲区”
  • 你的机器经久耐用。我已将答案用于此目的

  • 链接演示了如何运行修改后的代码,该代码用于确定正确的参数以及堆栈破坏。第一个为您提供了一个参数,您可以将该参数提供给第二个

    这是出了名的棘手问题,不需要查看生成的代码就可以获得正确的结果。你得到了什么?进程是否崩溃?溢出的
    缓冲区
    将写入它后面的内存,但
    修改的
    可能在它前面的内存中(取决于编译器)。这是一个ctf挑战,问题是@interjay:你知道有编译器可以编译它吗?或者gcc选项?可能在将其放入结构时尝试溢出它。据我所知,所有编译器都将保持结构顺序,因为您在编码时可能会依赖它。