"缓冲区溢出"漏洞是一个由来已久的漏洞类型,虽然现代操作系统的编译器,已经可以很大程度的阻止此类型漏洞的出现,但是作为一名合格的C程序员,还是有必要对此类漏洞的原理进行一定了解的,今天我就带大家对此类漏洞进行分析...原理分析 首先我们先对缓冲区溢出的原理进行分析: 缓冲区溢出的原理非常简单,总结起来就是一句话:程序向缓冲区写入了超过缓冲区最大能保存的数据。 为了方便大家的理解,我们来举个例子。...但是问题来了,dst 的大小本身只有 4 个字节,但是却要接受一个长度为 9 的字符串,如果复制成功了,肯定会覆盖内存中某些不应该被占用的空间。...如下图中的栈结构,如果将长度为16字节的字符串赋给 acArrBuf 数组,那么 EBP 和返回值都会被覆盖。...vsprintf很危险改为使用 vsnprintf,或者使用精度说明符。vscanf很危险使用精度说明符,或自己进行解析。vsscanf很危险使用精度说明符,或自己进行解析。
指向键盘任务应处理的字节 */ int count; /* 缓冲区中共有多少字节 */ char buf[KB_IN_BYTES]; /* 缓冲区 */ }KB_INPUT...对缓冲区进行添加操作,如果缓冲区已满,这里使用的策略是直接就把收到的字节丢弃。...我们就用开机默认的80x25文本模式,占用范围为0xB8000~0XBFFFF,显存大小为32KB,每2个字节代表一个字符。 ? VGA视频系统的寄存器 如何让系统显示指定位置的内容?...in_buf[TTY_IN_BYTES]; /* TTY 输入缓冲区 */ u32* p_inbuf_head; /* 指向缓冲区中下一个空闲位置 */ u32*...va_list其实是个char*,虽然用...表示了可变参数,不知道有几个参数,但其实vsprintf会根据cahr *fmt中的内容推算出有几个参数。
3 InputStream/OutputStream InputStream 是所有字节输入流的抽象父类,提供了以下方法: read() 读取一个字节 read(byte[] buf) 读取一定量的字节到缓冲区数组...try { 9 in = new FileInputStream(file); 10 11 // 【2】从管道读取多个字节到缓冲区...,提供了以下方法 write() 写入一个字节 write(byte[] buf) 写入一定量的字节到输出流 FileOutputStream 文件字节输出流,专门用于从内存中写入字节到文件中。...通过字节流写入文件时,向管道写入一个字节,该字节立即写入文件中。 InputStream/OutputStream 用于字节的读写。主要用于读写二进制文件(图片、音频、视频),较少用于读写文本型文件。...为了提高效率,File-Writer内部存在一个字节缓冲区,用于对待写入的字符进行统一编码到字节缓冲区,一定要在关闭流之前,调用flush方法刷新缓冲区,才能完成写入。
linux程序的常用保护机制 先来学习一些关于linux方面的保护措施,操作系统提供了许多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险,包括DEP、ASLR等。...gcc -D_FORTIFY_SOURCE=2 -o test test.c // 较强的检查gcc -D_FORTIFY_SOURCE=2 程序执行时也会有检查 (如果检查到缓冲区溢出,就终止程序)_...为什么不传递 “/bin/sh”的字符串地址到最后调用的system(“/bin/sh”),而是将”/bin/sh”写入 bss段 因为这里rdi=r15d=param1 r15d 32-bit 所以不能传递给...rdi 64-bit的 “/bin/sh” 字符串地址,所以必须写入到可写bss段,因为程序段就32-bit 00007f76:f3c0bd57|2f 62 69 6e 2f 73 68 00 65...create功能会先申请0x20字节的内存堆块存储结构,如果输入的字符串长度大于0xf,则另外申请指定长度的空间存储数据,否则存储在之前申请的0x20字节的前16字节处,在最后,会将相关free函数的地址存储在堆存储结构的后八字节处
第 8 行 :获取需要写入的字节缓冲区。为什么会有 writeBuffer != null 的判断后,使用不同的字节缓冲区,见:FlushCommitLogService。....) // 省略代码 说明 :插入消息到字节缓冲区。 第 45 行 :计算物理位置。在 CommitLog 的顺序存储位置。...线程服务 场景 插入消息性能 CommitRealTimeService 异步刷盘 && 开启内存字节缓冲区 第一 FlushRealTimeService 异步刷盘 && 关闭内存字节缓冲区 第二 GroupCommitService...同步刷盘 第三 MappedFile#落盘 方式 方式一 写入内存字节缓冲区(writeBuffer) 从内存字节缓冲区(write buffer)提交(commit)到文件通道(fileChannel...) 文件通道(fileChannel)flush 方式二 写入映射文件字节缓冲区(mappedByteBuffer) 映射文件字节缓冲区(mappedByteBuffer)flush ?
: int read(): 每次调用这个方法, 就读取一个字节, 以整数的形式返回,可以用 char 强转成字符 int read(byte[] buffer---缓冲区): 让流每次读满一个缓冲区..., 再统一处理, 先存在缓冲区里, 返回值int是返回实际当中读取了多少字节数(伤硬盘的原理) int read(byte[] buffer, int offset, int length):...也是一个缓冲区, 读取length长度的字节数, 存到buffer的缓冲区里, 从buffer的offset位置开始存, 返回值是实际读了多少字节数 close(): 关闭资源 OutputStream...=null){ 31 System.out.print(s); 32 bw.write(s); 33 bw.flush...();//如果写入需要用 flush 刷新流,否则会在缓冲区不写入文件 34 } 35 br.close(); 36 bw.close
第 8 行 :获取需要写入的字节缓冲区。为什么会有 writeBuffer != null 的判断后,使用不同的字节缓冲区,见:FlushCommitLogService。...FlushCommitLogService类图 线程服务 场景 插入消息性能 CommitRealTimeService 异步刷盘 && 开启内存字节缓冲区 第一 FlushRealTimeService...异步刷盘 && 关闭内存字节缓冲区 第二 GroupCommitService 同步刷盘 第三 MappedFile#落盘 方式 方式一 写入内存字节缓冲区(writeBuffer) 从内存字节缓冲区...(write buffer)提交(commit)到文件通道(fileChannel) 文件通道(fileChannel)flush 方式二 写入映射文件字节缓冲区(mappedByteBuffer)...映射文件字节缓冲区(mappedByteBuffer)flush ?
补充:必须指定用户进程缓冲区的长度n,即buf的大小,此函数从流中一直读到下一个换行符为止,但是不超过n-1个字符,读入的字符被送入用户缓冲区buf中。该缓冲区以null字符结尾。...成功:返回输出字符数;出错:返回负值; 实现:输出流<-格式字符串<-内存变量,同于fprintf,只是将原来的可变参数…换成了arg; 原因:要将内存变量的数据做格式变换,再将变换的结果放入流中 vsprintf...(); 格式:#include #include int vsprintf(char *restrict buf, const char *restrict...;出错:返回-1; 实现:文件(fd)->内存向量中 原因:在一次函数调用中读、写多个非连续缓冲区,但是这些缓冲区已经用iovec表示好了。...;出错:返回-1; 实现:文件(fd)<-内存向量 原因:在一次函数调用中读、写多个非连续缓冲区,但是这些缓冲区已经用iovec表示好了。
接着,我们使用 setInt32() 方法在缓冲区的第 3 个字节写入了一个 32 位有符号整数 0x789ABCDE。...首先,我们使用 setFloat32() 方法在缓冲区的第 0 个字节写入了一个 32 位浮点数 3.14。...首先,我们使用 setInt32() 方法在缓冲区的前 4 个字节写入了一个 32 位有符号整数 0x12345678。...然后,我们使用 setInt32() 方法在缓冲区的第 4 个字节到第 7 个字节写入了一个 32 位有符号整数 0x87654321。...接着,我们使用 setInt32() 方法在缓冲区的第 8 个字节到第 11 个字节写入了一个 32 位有符号整数 0x456789AB。
,因此,只有在每次填充 1024 字节缓冲区时,才应将输出到此流的数据写入文件。...缓冲区的大小应至少为 n 个字符。 n:缓冲区中要使用的最大字节数。生成的字符串的长度最多为 n-1,为其他终止 null 字符留出空间。...int vsprintf (char * s, const char * format, va_list arg ); 参数: s:指向存储生成的 C 字符串的缓冲区的指针。...size:要写入的每个元素的大小(以字节为单位)。 count:元素数,每个元素的大小为字节。 stream:指向指定输出流的 FILE 对象的指针。...返回值: 成功:返回成功写入的元素总数。 如果此数字与 count 参数不同,则表示写入错误阻止了函数完成。在这种情况下,将为流设置错误指示器 (ferror)。
返回错误 os.O_TRUNC 打开一个文件并截断它的长度为零(必须有写权限) os.O_BINARY 以二进制模式打开文件(不转换) os.O_NOINHERIT 阻止创建一个共享的文件描述符...fd = os.open('tmp/mmaptest', os.O_CREAT | os.O_TRUNC | os.O_RDWR) # 建立内存缓冲区 # not win32 buf = mmap.mmap...buf.write(f) # 写入文件 # 当前指针位置 buf.tell() # 移动指针到第11个字节 buf.seek(10) # 将内存中的信息写入文件 buf.flush(0, 100...cv2 import numpy as nps # 创建内存映射文件句柄 fd = os.open('share_memory/tmp/mmaptest', os.O_RDONLY) # 建立内存缓冲区...# not win32 buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_READ) # win32 buf = mmap.mmap
当写入缓冲区的数据量超过预期的数据量时,内存缓冲区溢出。例如,当预期最大为8个字节的用户名并且给出10个字节的用户名并将其写入缓冲区时,就会发生这种情况。...在这种情况下,缓冲区超过2个字节,并且在未阻止发生时会发生溢出。这通常是由于糟糕的编程和缺乏输入清理造成的。 将10个字节的数据(用户名12)写入8字节缓冲区时缓冲区溢出的示例。...防止缓冲区溢出 最好和最有效的解决方案是防止代码中发生缓冲区溢出情况。例如,当预期最多8个字节作为输入数据时,可以将任何时候写入缓冲区的数据量限制为8个字节。...在您选择的IDE中,代码看起来如下图所示: 在这个例子中,缓冲区溢出了2个包含无害1和2的字节。由于strcpy()函数不执行边界检查,我们可以在缓冲区空间之外写入任何内容。...可以使用多种技术主动防止和缓解缓冲区溢出。程序员应该编写安全代码并测试它是否存在缓冲区溢出。当不阻止缓冲区溢出时,仍然可以使用诸如保护内存不被写入的反应方法来缓解它。
传输层和网络层的数据流转 数据传输(出站) : 首先,应用程序通过操作系统提供网络套接字API(编程接口)将数据写入到socket文件描述符, 即数据被写入到 socket 文件,然后放到传输缓存中,常见的协议包括...字节的数据: 来自 8.8.8.8 的回复: 字节=32 时间=168ms TTL=109 来自 8.8.8.8 的回复: 字节=32 时间=169ms TTL=109 来自 8.8.8.8 的回复:...字节=32 时间=169ms TTL=109 来自 8.8.8.8 的回复: 字节=32 时间=169ms TTL=109 8.8.8.8 的 Ping 统计信息: 数据包: 已发送 = 4...当分片之间的偏移超过此阈值时,内核会丢弃分片并阻止重组,以防止可能的攻击和资源耗尽。...我们可以使用 nmcli 修改网卡的 MTU 大小(下面的例子将 ens33 网卡的 MTU 修改为 9000) nmcli con modify ens33 802-3-ethernet.mtu
32 } 33 fclose(p); 34 35 return 0; 36 } 37 输出结果为: 38 64 39 0 40 0 41 0 42 15 43 cd 44...32 printf("%d, %d\n", a[0], a[1]); 33 } 34 fclose(p); 35 36 return 0; 37 } 38...-------------------------------------- 那么我们现在想绕过缓冲区,想直接将缓冲区的内容写入文件中(即磁盘)。该如何办呢?答:使用fflush函数。 ...fflush函数可以将缓冲区中任何未写入的数据直接写入文件(即磁盘)中。 函数执行成功则返回0,失败则返回EOF。...break; 33 fprintf(p, "%s\n", a); 34 fflush(p); //把缓冲区的数据直接同步到磁盘。
5 int fflush(FILE *stream)刷新流 stream 的输出缓冲区。...FILE *stream, long int offset, int whence)设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数...26 int vsprintf(char *str, const char *format, va_list arg)使用参数列表发送格式化输出到字符串。...32 int fputc(int char, FILE *stream)把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。...33 int fputs(const char *str, FILE *stream)把字符串写入到指定的流 stream 中,但不包括空字符。
buf.length个字节还是写入b个字节 210 211 * 写buf.length个字节一定是不恰当的,因为最终读取的时候 212 213...* 228 229 * 说明文档中对read方法的返回值的描述: 230 231 * 读入缓冲区的字节总数...* 示应将这些字节立即写入它们预期的目标。...* 如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件), 264 265 * 则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入..., 266 267 * 但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。
const buf6 = Buffer.from('tést', 'latin1'); 写入缓冲区 语法 写入 Node 缓冲区的语法如下所示: buf.write(string[, offset[,...offset - 缓冲区开始写入的索引值,默认为 0 。 length - 写入的字节数,默认为 buffer.length encoding - 使用的编码。默认为 'utf8' 。...执行以上代码,输出结果为: $node main.js 写入字节数 : 14 ---- 从缓冲区读取数据 语法 读取 Node 缓冲区数据的语法如下所示: buf.toString([encoding...32 buf.readFloatBE(offset[, noAssert]) 根据指定的偏移量,使用指定的 endian 字节序格式读取一个 32 位双浮点数,大端对齐。...33 buf.readDoubleLE(offset[, noAssert]) 根据指定的偏移量,使用指定的 endian字节序格式读取一个 64 位双精度数,小端对齐。
补充:必须指定用户进程缓冲区的长度n,即buf的大小,此函数从流中一直读到下一个换行符为止,但是不超过n-1个字符,读入的字符被送入用户缓冲区buf中。该缓冲区以null字符结尾。...;size是写入的每个元素的大小,单位为字节;count是写入的元素的数量;stream是文件的文件指针。...成功:返回输出字符数;出错:返回负值; 实现:输出流<-格式字符串<-内存变量,同于fprintf,只是将原来的可变参数…换成了arg; 原因:要将内存变量的数据做格式变换,再将变换的结果放入流中 vsprintf...(); 格式:#include #include int vsprintf(char *restrict buf, const char *restrict...;出错:返回-1; 实现:文件(fd)<-内存向量 原因:在一次函数调用中读、写多个非连续缓冲区,但是这些缓冲区已经用iovec表示好了。
StreamReader (Stream, Encoding, Boolean, Int32) // 为指定的流初始化 StreamReader 类的新实例,带有指定的字符编码、字节顺序标记检测选项和缓冲区大小...) //为指定的文件名初始化 StreamReader 类的新实例,带有指定字符编码、字节顺序标记检测选项和缓冲区大小。...bufferSize,FileOptions options,FileSecurity fileSecurity) ---- 三、FileStream常用的方法: Read() //从流中读取字节块并将该数据写入给定缓冲区中...Convert.ToChar(b).ToString()); 假设文件的内容是:abcdefghijk 那结果就是:c 和 j Write() //使用从缓冲区读取的数据将字节块写入该流...,在 I/O 操作完成之前一直阻止。
对于这样的流,Flush 方法可用于清除所有内部缓冲区并确保将所有数据写入基础数据源或储存库。 在 Stream 上调用 Close 将刷新所有经过缓冲处理的数据,本质上是为您调用了 Flush。...当从 Stream 派生时,如果有内部字节缓冲区,则强烈建议重写这些方法以访问内部缓冲区,这样性能将得到显著提高。...内存流可降低应用程序中对临时缓冲区和临时文件的需要。 用无符号字节数组创建的内存流提供无法调整大小的数据流。...Read(Char[],Int32,Int32) 和 Write(Char[],Int32,Int32) 方法重载读取和写入 count 参数指定的字符数。...()); 31 } 32 r.Close(); 33 fs.Close(); 34 } 35 }
领取专属 10元无门槛券
手把手带您无忧上云