c++ - 缓冲区溢出的第一次实验

标签 c++ c linux stack-overflow buffer-overflow

我已经开始阅读有关缓冲区溢出以及黑客如何使用它来执行自定义代码而不是常规编译代码的内容,现在我尝试使用一个易受攻击的函数将数据复制到 char 数组中来重现一些基本情况不安全的 strcpy。

重点是,当我使用程序中定义的函数的汇编指令之一更改返回地址时,它工作正常,而当我直接以字节形式注入(inject)代码时,它会返回 SEGMENTATION FAULT。


我使用的是 Kali 发行版 x64 v3.18

我已禁用地址空间布局随机化 (ASLR):

echo 0 > /proc/sys/kernel/randomize_va_space

并禁用编译器添加的堆栈保护代码:

gcc -g -fno-stack-protector exbof.c -o exbof


代码:

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

int main(int argc, char **argv){
    char buffer[500] = {0};
    strcpy(buffer, argv[1]);

    return 0;
}


用法:

./exbof `perl -e 'print "x90"x216;          // nop sled 
                  print CUSTOM_CODE;        // my code  
                  print "xff"x(500 - 216 - CODE_LENGTH);     // fill empty space
                  print "xff"xOFFSET        // distance between the last byte 
                                            // of buffer and the return address 
                  printf("\\x%lx", BUFFER_ADDRESS + int(rand(26)) * 8);'`



输出:

Segmentation Fault

在 GDB 中:

Program received signal SIGSEGV, Segmentation fault.
0x00007fffffffxyzt in ?? ()


我已经使用 GDB 对其进行了调试,代码将新地址正确写入堆栈中。
我正在使用在线找到的 shellcode exec,但我也尝试从我的程序中注入(inject)一段以字节为单位的代码,当我使用 GDB 检查时,注入(inject)的汇编代码被证明是有效的代码和原来的一模一样。
在我看来,.text 内存段之外的任何地址都不起作用。


有建议吗?

最佳答案

解决方案:

按照@andars的建议,有必要设置将堆栈标记为可执行的标志。


因此,如果您想尝试此操作并开始解决缓冲区溢出问题,您必须:

  • 禁用地址空间布局随机化 (ASLR):

    echo 0 >/proc/sys/kernel/randomize_va_space

  • 禁用编译器添加的堆栈保护代码:

    gcc -g -fno-stack-protector your_program.c -o your_program

  • 在程序头中设置一个标志以将堆栈标记为可执行:

    execstack -s your_program

    • 或者您可以直接在汇编时或链接时执行此操作:

      gcc -g -fno-stack-protector -z execstack your_program.c -o your_program

关于c++ - 缓冲区溢出的第一次实验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35932142/

相关文章:

c - 如何在C中使用malloc初始化静态指针?

c++ - C(++) 类型名称函数/宏

c++ - 对象指针 vector ,初始化

c++ - 是否仅在创建类的对象时才调用构造函数?

c++ - cython cmake 模块运行时错误

linux - Makefile 异常 : Invoke `make` and it appears to be running another makefile

c++ - 有没有办法从标题中推断出链接标志?

c - Linux 内核 : Static Const vs #Define

c++ - 使用c++更改任何linux用户密码

linux - 无法通过 sh 脚本创建数字目录