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