buffer-overflow相关内容
当我尝试通过 GCC 编译使用 gets() 函数的 C 代码时,我收到以下警告: (.text+0x34):警告:`gets' 函数很危险,不应使用. 我记得这与堆栈保护和安全性有关,但我不确定具体原因. 我怎样才能删除这个警告?为什么会有关于使用 gets() 的警告? 如果 gets() 如此危险,那我们为什么不能删除它呢? 解决方案 为了安全地使用 gets
..
我查看了缓冲区溢出漏洞的基础知识,并试图了解堆栈是如何工作的.为此,我想编写一个简单的程序,将返回地址的地址更改为某个值.谁能帮我弄清楚基指针的大小以获取第一个参数的偏移量? void foo(void){字符 ret;字符 *ptr;ptr = &ret;//在这里添加一些偏移值*ptr = 0x00;}int main(int argc, char **argv){富();返回 1;} 生
..
我正在学习计算机安全课程,并且有一个额外的学分分配将可执行代码插入缓冲区溢出.我有我正在尝试操作的目标程序的 c 源代码,并且我已经到了可以成功覆盖当前函数堆栈帧的 eip 的地步.但是,我总是遇到分段错误,因为我提供的地址总是错误的.问题是当前函数位于 pthread 内部,因此,堆栈的地址似乎总是在程序的不同运行之间发生变化.是否有任何方法可以在 pthread 中查找堆栈地址(或用于估计 p
..
我有下面的代码来模拟缓冲区溢出. 编辑:我错过了下面代码中的一个重要步骤.随着讨论的进行,变量 c 正在被修改. void 函数 (int fd, int e){诠释 i = 0;诠释n;字符 c;字符[44];..c = getchar(fd);.//对c的一些检查s[i++] = c;.//更多的局部变量和对它们的一些操作.} 我试图通过发送更多 > 4 字节的输入来溢出缓冲区,以查
..
我找不到可以回答这个问题的好消息来源.我知道 nop sled 是一种用于在缓冲区溢出攻击中规避堆栈随机化的技术,但我无法理解它是如何工作的. 有什么简单的例子来说明这种方法? 128 字节 nop sled 之类的术语是什么意思? 解决方案 一些攻击包括使程序跳转到特定地址并从那里继续运行.注入的代码必须事先以某种方式加载到该确切位置. 堆栈随机化和其他运行时差异可能使
..
每个线程都有自己的堆栈来存储局部变量.但堆栈也用于在调用函数时存储返回地址. 在 x86 汇编中,esp 指向最近分配的堆栈末端.今天,大多数 CPU 的堆栈都是负增长的.此行为通过溢出缓冲区并覆盖保存的返回地址来启用任意代码执行.如果堆栈正向增长,这样的攻击将不可行. 让调用堆栈向上增长是否更安全?为什么 Intel 设计 8086 时堆栈向下增长?他们是否可以在任何后来的 CPU
..
我想利用基于堆栈的缓冲区溢出来进行教育. 有一个典型的函数使用来自 main 的参数调用,该函数作为程序的输入提供给保存参数的本地缓冲区.给定一个 nops+shellcode+address_shellcode 的输入,我将利用它. 在使用 gdb 调试后,我找到了 shell 代码的地址,因为它将作为参数传递,并且在 strcpy 之后我检查了堆栈和 $ebp+8 已成功地被 sh
..
void function(int a, int b, int c) {字符缓冲区1[5];字符缓冲区2[10];诠释 *ret;ret = 缓冲区 1 + 12;(*ret) += 8;//为什么是8??}无效的主要(){诠释 x;x = 0;函数(1,2,3);x = 1;printf("%d\n",x);} 上面的demo来自这里: http://insecure.org/stf/s
..
我正在尝试实施缓冲区溢出攻击,我需要知道我试图溢出的缓冲区的地址. 使用 GDB 显示的地址与我刚刚在代码中显示的地址不同: 具体代码: #includeint main() {字符缓冲区[20];printf("%p\n", 缓冲区);//0xbffff320返回0;} 但是,如果我这样做,在 gdb 中: p &buffer 我得到:0xbffff330
..
有没有一种方法可以向使用 %s 的 scanf 发出非 ascii 十六进制字符?我正在尝试插入像 \x08\xDE\xAD 等十六进制字符(以演示缓冲区溢出). 输入的不是命令行参数,而是程序内部的一个scanf. 解决方案 我假设你想在标准输入上提供任意数据(因为你使用 scanf 阅读). 您可以使用 shell 创建数据并将其通过管道传输到您的程序中,例如 print
..
我正在尝试运行这个 shellcode,但我不断收到分段错误 /* call_shellcode.c *//*一个创建包含启动shell代码的文件的程序*/#include #include #include 常量字符代码[] ="\x31\xc0"/* 第 1 行:xorl %eax,%eax */"\x50"/* 第 2 行: pus
..
我正在使用下面的代码尝试通过溢出 searchstring 变量来执行存储在环境变量中的一些 shellcode,以便 main 的返回地址包含环境变量的地址.但是,我在 printf 命令之前遇到了分段错误. #include #include 无效的主要(int argc,char *argv[]){字符搜索字符串[100];如果(argc > 1)st
..
在从函数 A() 调用函数 B() 期间,B() 分配一个 100 字符的数组并多次填充,包括一次使用 101 字符的字符串和一次使用 110 字符的字符串.这是一个明显的错误. 后来,函数 A() 尝试访问完全不相关的 int 变量 i,结果出现分段错误. 我明白为什么会发生缓冲区溢出,但是为什么我在访问这个整数时会出现分段错误?为什么我不简单地获取垃圾数据? 解决方案 当A
..
这是发生分段错误的一段代码(未调用 perror): job = malloc(sizeof(task_t));如果(工作 == NULL)perror("malloc"); 更准确地说,gdb 表示 segfault 发生在 __int_malloc 调用中,这是由 malloc 进行的子例程调用. 由于 malloc 函数是与其他线程并行调用的,最初我认为这可能是问题所在.我使用的是
..
来自GNU C 编程教程: fgets(“文件获取字符串")函数类似于gets功能.此函数已弃用 -- 这意味着它已过时强烈建议您不要使用它——因为它是危险的.这是危险的,因为如果输入数据包含空值性格,你看不出来.除非你知道数据,否则不要使用 fgets不能包含空值.不要用它来读取用户编辑的文件因为,如果用户插入空字符,您应该正确处理或打印清晰的错误信息.一直使用如果可以,getline 或
..
注意:我知道 ffmpeg 和 libav 是不同的库.这是两者的共同问题. 免责声明:SO 问题的重复 标记为已回答但实际上没有给出正确的解决方案. UDP 缓冲区大小不足会导致多个高分辨率视频流的流中断.在 LibAV/FFMPEG 中,可以通过附加一些 选项(缓冲区大小). 但是,对于 RTSP 网址,这是不支持. 这些是我找到的唯一解决方案: 重建 ffmpe
..
我正在做作业问题 需要禁用编译器优化保护才能工作.我在 ubuntu linux 上使用 gcc 4.4.1,但无法确定哪些标志是正确的.我意识到它依赖于架构 - 我的机器使用 32 位英特尔处理器运行. 谢谢. 解决方案 这是个好问题.为了解决该问题,您还必须禁用 ASLR,否则 g() 的地址将不可预测. 禁用 ASLR: sudo bash -c 'echo 0 >/p
..
我使用的是 CentOS 6.4 32 位,并试图导致程序中的缓冲区溢出.在 GDB 中它有效.这是输出: [root@localhost bufferoverflow]# gdb stackGNU gdb (GDB) 红帽企业 Linux (7.2-60.el6_4.1)版权所有 (C) 2010 Free Software Foundation, Inc.许可证 GPLv3+:GNU GPL
..
编辑:我已经添加了示例的源代码. 我遇到了 这个例子: char source[MAX] = "123456789";char source1[MAX] = "123456789";字符目的地[MAX] = "abcdefg";char destination1[MAX] = "abcdefg";字符 *return_string;整数索引 = 5;/* 这就是 strcpy 的工作原理
..
我使用此代码: while ( scanf("%s", buf) == 1 ){ 防止可能的缓冲区溢出以便它可以传递随机长度的字符串的最佳方法是什么? 我知道我可以通过调用来限制输入字符串,例如: while ( scanf("%20s", buf) == 1 ){ 但我更希望能够处理用户输入的任何内容.或者这不能使用 scanf 安全地完成,我应该使用 fgets? 解决方案
..