我已经开始阅读有关缓冲区溢出以及黑客如何使用它来执行自定义代码而不是常规编译代码的内容,现在我尝试使用一个易受攻击的函数将数据复制到 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/