先用缓冲区溢出进行实验

我已经开始阅读关于缓冲区溢出,以及如何黑客使用它来执行自定义代码,而不是常规编译的,现在我试图重现一些基本情况,用一个可变的函数复制数据到不安全的strcpy 。

重点是, 当我改变程序中定义的函数程序集指令之一的返回地址时,它工作正常,而当我直接以字节注入代码它返回分段故障。


我使用的是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来debugging它, 代码在堆栈中正确写入新的地址。
我正在使用一个在线发现的shellcode exec,但我也尝试从我的程序中以字节的forms注入一段代码, 当我使用GDB进行检查时,注入的汇编代码竟然是有效代码,与原始代码完全相同一。
在我看来,任何地址.text内存段不起作用。

build议?

解:

正如@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