Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 无论缓冲区大小如何,都无法访问$eip-gdb_C_Security_Gdb_Buffer Overflow - Fatal编程技术网

C 无论缓冲区大小如何,都无法访问$eip-gdb

C 无论缓冲区大小如何,都无法访问$eip-gdb,c,security,gdb,buffer-overflow,C,Security,Gdb,Buffer Overflow,我有下面的C文件vuln.C,我正试图进行缓冲区溢出攻击。我的目标是将$eip设置为函数read\u secret的地址 #include <stdlib.h> #include <stdio.h> #include <string.h> void read_secret() { FILE *fptr = fopen("/task2/secret.txt", "r"); char secret[1024]; fscanf(fptr,

我有下面的C文件vuln.C,我正试图进行缓冲区溢出攻击。我的目标是将
$eip
设置为函数read\u secret的地址

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

void read_secret() {
    FILE *fptr = fopen("/task2/secret.txt", "r");
    char secret[1024];
    fscanf(fptr, "%512s", secret);
    printf("Well done!\nThere you go, a wee reward: %s\n", secret);
    exit(0);
}

int fib(int n)
{
   if ( n == 0 )
      return 0;
   else if ( n == 1 )
      return 1;
   else
      return ( fib(n-1) + fib(n-2) );
} 

void vuln(char *name)
{
    int n = 20;
    char buf[1024];
    int f[n];
    int i;
    for (i=0; i<n; i++) {
      f[i] = fib(i);
    }
    strcpy(buf, name);
    printf("Welcome %s!\n", buf);
    for (i=0; i<20; i++) {
      printf("By the way, the %dth Fibonacci number might be %d\n", i, f[i]);
    } 
}


int main(int argc, char *argv[])
{
    if (argc < 2) {
        printf("Provide your name\n");
        return 0;
    }

    vuln(argv[1]);
    return 0;
}

#包括
#包括
#包括
void read_secret(){
文件*fptr=fopen(“/task2/secret.txt”,“r”);
字符秘密[1024];
fscanf(fptr,“%512s”,机密);
printf(“干得好!\n在你走之前,一个小小的奖励:%s\n”,秘密);
出口(0);
}
整数fib(整数n)
{
如果(n==0)
返回0;
else如果(n==1)
返回1;
其他的
返回(fib(n-1)+fib(n-2));
} 
void vuln(字符*名称)
{
int n=20;
char-buf[1024];
int f[n];
int i;

对于(i=0;i而言,问题在于程序内部出现了一个点,程序试图打印f[i]。这些被缓冲区覆盖为非法地址(即0x4141)

我所做的是,我从“info reg”($ebp)中选择了一个对我有效的地址,并多次插入该地址,直到我找到$eip。基本上,你想在这里选择一个合法地址


然后,我会减少我选择的地址被重复的次数,并放置一个“AAAA”以查看$eip的位置。一旦我找到$eip,我会将我想要执行的函数的地址放在那里。

你是如何编译你的程序的?你应该使用
-fno stack protector
和(在我的情况下)
-m32
。您是否尝试过使用GDB单步执行您的程序?使用
-g
标志编译并尝试通过
GDB a.out运行它。这不是答案。我使用中的注释来收集更多信息,因为您最初的问题不够具体。学习缓冲区溢出失败的常见根本原因ow攻击是在不关闭安全标志的情况下使用现代gcc。由于您甚至无法通过传入来获取x414141地址,这意味着您根本没有溢出缓冲区。可能您没有在堆栈上的正确位置移动。您的
buf
变量和函数的地址是什么?请尝试
-fno PIC-fno PIE-no PIE
编译选项。@user617040我也是新手,我花了大约1-2个小时试图覆盖
eip
。我建议使用一个更简单的示例。我看到
n
被覆盖,并且因此在
fib
函数上出现seg错误。我当前的代码正在使用一个更简单的程序版本。但是每当我得到写入地址(
0x08045456
)它跳转到一个新地址,导致一个无效的内存错误。我不知道为什么它会跳转,但我肯定能够确认
eip
正在改变,因为我可以看到x41在我增加传入的
a
的数量时缓慢地输入它。@VeridianDynamics感谢您在这方面花费了这么多时间!我终于在我的程序上获得了$eip在缓冲区中写入合法地址,而不是后跟“A”。