首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

你知道C语言中的危险函数吗?

"缓冲区溢出"漏洞是一个由来已久的漏洞类型,虽然现代操作系统的编译器,已经可以很大程度的阻止此类型漏洞的出现,但是作为一名合格的C程序员,还是有必要对此类漏洞的原理进行一定了解的,今天我就带大家对此类漏洞进行分析...原理分析 首先我们先对缓冲区溢出的原理进行分析: 缓冲区溢出的原理非常简单,总结起来就是一句话:程序向缓冲区写入了超过缓冲区最大能保存的数据。 为了方便大家的理解,我们来举个例子。...但是问题来了,dst 的大小本身只有 4 个字节,但是却要接受一个长度为 9 的字符串,如果复制成功了,肯定会覆盖内存中某些不应该被占用的空间。...如下图中的栈结构,如果将长度为16字节的字符串赋给 acArrBuf 数组,那么 EBP 和返回值都会被覆盖。...vsprintf很危险改为使用 vsnprintf,或者使用精度说明符。vscanf很危险使用精度说明符,或自己进行解析。vsscanf很危险使用精度说明符,或自己进行解析。

1.6K10

《一个操作系统的实现》笔记(7)--输入输出系统(IO)

指向键盘任务应处理的字节 */ 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中的内容推算出有几个参数。

73040
您找到你想要的搜索结果了吗?
是的
没有找到

IO(上)

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方法刷新缓冲区,才能完成写入

43010

Linux pwn入门学习到放弃

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函数的地址存储在堆存储结构的后八字节

3.5K10

消息队列中间件 RocketMQ 源码分析 —— Message 存储

第 8 行 :获取需要写入字节缓冲区。为什么会有 writeBuffer != null 的判断后,使用不同的字节缓冲区,见:FlushCommitLogService。....) // 省略代码 说明 :插入消息到字节缓冲区。 第 45 行 :计算物理位置。在 CommitLog 的顺序存储位置。...线程服务 场景 插入消息性能 CommitRealTimeService 异步刷盘 && 开启内存字节缓冲区 第一 FlushRealTimeService 异步刷盘 && 关闭内存字节缓冲区 第二 GroupCommitService...同步刷盘 第三 MappedFile#落盘 方式 方式一 写入内存字节缓冲区(writeBuffer) 从内存字节缓冲区(write buffer)提交(commit)到文件通道(fileChannel...) 文件通道(fileChannel)flush 方式二 写入映射文件字节缓冲区(mappedByteBuffer) 映射文件字节缓冲区(mappedByteBuffer)flush ?

1K130

Java之IO流概述和File基本操作

:   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

77690

CCPP输入输出函数汇总分析

补充:必须指定用户进程缓冲区的长度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表示好了。

1.2K20

CC++ (stdio.h)标准库详解

,因此,只有在每次填充 1024 字节缓冲区时,才应将输出到此流的数据写入文件。...缓冲区的大小应至少为 n 个字符。 n:缓冲区中要使用的最大字节数。生成的字符串的长度最多为 n-1,为其他终止 null 字符留出空间。...int vsprintf (char * s, const char * format, va_list arg ); 参数: s:指向存储生成的 C 字符串的缓冲区的指针。...size:要写入的每个元素的大小(以字节为单位)。 count:元素数,每个元素的大小为字节。 stream:指向指定输出流的 FILE 对象的指针。...返回值: 成功:返回成功写入的元素总数。 如果此数字与 count 参数不同,则表示写入错误阻止了函数完成。在这种情况下,将为流设置错误指示器 (ferror)。

34510

缓冲区溢出说明:基础知识

写入缓冲区的数据量超过预期的数据量时,内存缓冲区溢出。例如,当预期最大为8个字节的用户名并且给出10个字节的用户名并将其写入缓冲区时,就会发生这种情况。...在这种情况下,缓冲区超过2个字节,并且在未阻止发生时会发生溢出。这通常是由于糟糕的编程和缺乏输入清理造成的。 将10个字节的数据(用户名12)写入8字节缓冲区缓冲区溢出的示例。...防止缓冲区溢出 最好和最有效的解决方案是防止代码中发生缓冲区溢出情况。例如,当预期最多8个字节作为输入数据时,可以将任何时候写入缓冲区的数据量限制为8个字节。...在您选择的IDE中,代码看起来如下图所示: 在这个例子中,缓冲区溢出了2个包含无害1和2的字节。由于strcpy()函数不执行边界检查,我们可以在缓冲区空间之外写入任何内容。...可以使用多种技术主动防止和缓解缓冲区溢出。程序员应该编写安全代码并测试它是否存在缓冲区溢出。当不阻止缓冲区溢出时,仍然可以使用诸如保护内存不被写入的反应方法来缓解它。

1.3K10

Linux 性能调优之网络内核参数优化

传输层和网络层的数据流转 数据传输(出站) : 首先,应用程序通过操作系统提供网络套接字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

1.1K20

开心档之Node.js Buffer(缓冲区)

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 位双精度数,小端对齐。

1.1K10

CCPP输入输出函数汇总分析

补充:必须指定用户进程缓冲区的长度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表示好了。

1.8K20
领券