两学一做教育网站郑州网站seo外包

张小明 2026/1/12 16:10:11
两学一做教育网站,郑州网站seo外包,新媒体运营培训课,学室内装修设计分享一个最近遇到的栈溢出的经典例子。 1. 问题现象 某个状态码从正常的 0x01 突然变了。 核心代码简化后如下#xff1a; 两次打印之间只调用了 read_data()#xff0c;没有任何代码修改 status#xff0c;但它就是变了。某个情况下read_data读到了24个字节的数据#xff…分享一个最近遇到的栈溢出的经典例子。1. 问题现象某个状态码从正常的0x01突然变了。核心代码简化后如下两次打印之间只调用了read_data()没有任何代码修改status但它就是变了。某个情况下read_data读到了24个字节的数据但是缓冲区只给了16个字节溢出了溢出的字节覆盖了status。这种栈溢出篡改数据的问题在定位到的时候觉得很简单。但是实际这种情况并且是偶现问题而且代码不像是上面这个简化代码这么简单问题代码藏在一堆代码之间排查起来还是挺费时间的。2. 原因分析为了理解为何status会被改我们需要看清函数栈帧的内存布局栈向下增长局部变量按声明顺序从高地址向低地址分配。strcpy写入24字节到16字节的buffer时多出的8字节会向上溢出覆盖相邻的内存区域。注意同一函数内局部变量的布局由编译器决定不一定按声明顺序。即首先声明的变量不一定是存放在高地址。栈的生长方向不能改变这是由 CPU 架构决定。测试代码运行结果status的地址0x7ffc8b2a3c4f正好在buffer地址0x7ffc8b2a3c40之后15字节处0x40 0x0f 0x4f。解决方案用安全版本的字符串函数。2.1 为什么栈会溢出C语言的strcpy、sprintf等函数不做边界检查。当源数据大于目标缓冲区时多余数据会继续写入相邻内存。栈上相邻的可能是其他局部变量本案例函数返回地址更危险会导致程序崩溃或被利用栈帧指针EBP/RBP2.2 编译器选项增强检测现代编译器GCC 7有栈保护机制Stack Canary但默认只保护返回地址不保护局部变量之间的溢出。可以通过编译选项增强检测# 栈保护检测返回地址破坏gcc -fstack-protector-all -otesttest.c# AddressSanitizer检测所有内存越界gcc -fsanitizeaddress -g -otesttest.c使用 AddressSanitizer 重新编译运行立即得到精确报错12345ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffc8b2a3c50WRITE of size 24 at 0x7ffc8b2a3c40 thread T0#0 0x... in strcpy#1 0x... in read_data test.c:6#2 0x... in data_process test.c:153. 栈溢出预防措施3.1 代码规范禁止使用的危险函数危险函数安全替代原因strcpystrncpy/strlcpy无边界检查sprintfsnprintf无边界检查getsfgets无法限制长度scanf(%s)scanf(%Ns)无边界检查3.2 工具静态分析# Cppcheckcppcheck --enableall --error-exitcode1 src/# Clang Static Analyzerscan-build make动态检测测试环境默认开启# Valgrind内存检测valgrind --leak-checkfull ./test# AddressSanitizerASAN_OPTIONSdetect_stack_use_after_return1 ./test相关文章嵌入式开发调试利器 | Sanitizer检测器工具 | Valgrind仿真调试工具的使用推荐一个好用的嵌入式静态代码扫描工具总结永远不要相信输入数据的长度即使是可信的传感器数据。编译器不会完全保护你需要主动启用检测工具。栈溢出是最常见的内存错误但只要建立起缓冲区必须传大小的编码习惯90%的问题都可以避免。如果这篇文章对你有帮助欢迎转发。欢迎分享你的踩坑经历。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

学网站建设设计要钱吗建设工程网站什么时候可以同步

你是否曾经在配置网络连接时,被那个神秘的TAP驱动程序搞得焦头烂额?明明按照教程一步步操作,却总是在最后关头出现"设备无法启动"或"驱动程序签名错误"的提示?别担心,今天我们就来聊聊那些让开发者…

张小明 2026/1/10 10:02:38 网站建设

火花机 东莞网站建设网页设计培训学校哪家好

作为持证多年的胡杨学长,在项目管理圈摸爬滚打这么久,最直观的感受就是:咱们早已进入项目数据 “爆炸” 的时代!公司会追踪代码审查耗时、统计交付流程延迟,甚至能预测错误数量和团队倦怠度。但有意思的是,…

张小明 2026/1/10 10:02:38 网站建设

德州做网站最好的公司有哪些培训门户网站源码

No.26 基于FPGA的cordic算法实现,输出sin和cos波形(quartusii版本),包括程序操作录像,算法程序 CORDIC为Coordinate rotation digital computer的缩写,来自于J.E.Volder发表于1959年的论文中,是一种不同于“paper and penci\"思路的一种…

张小明 2026/1/10 10:02:42 网站建设

搜网站技巧wordpress熊掌号出图

问题核心:为什么需要边缘控制? 【免费下载链接】controlnet-canny-sdxl-1.0 项目地址: https://ai.gitcode.com/hf_mirrors/diffusers/controlnet-canny-sdxl-1.0 在AI图像生成领域,传统文本到图像模型虽然强大,但往往难以…

张小明 2026/1/10 10:02:43 网站建设

广东建设银行招聘网站做借贷网站平台

在敏捷开发与DevOps普及的当下,软件测试已从单纯的缺陷发现转向质量保障与业务价值交付的关键环节。对测试从业者而言,科学衡量测试有效性不仅是证明团队价值的基础,更是优化测试策略、提升ROI的重要依据。本文将围绕量化指标体系建设、过程质…

张小明 2026/1/10 10:02:43 网站建设