sprintf 使用不当越界修改内存
来源:互联网 发布:mac手绘用什么软件 编辑:程序博客网 时间:2024/06/05 06:45
sprintf “%02X” 导致越界修改内存
使用sprintf 中二进制转换16进制(“%02X”)时,传入参数要在char型的范围内;同理,在做其他的转换时,对应的参数要在合理的范围内,否则可能发生内存的改写,影响附近内存块的数据安全。
前言
二进制转换为16进制字符串表示时,1 Byte 的二进制需要2 Byte的char型存储空间。C语言中,二进制转换为16进制,一般采用类似下面这样的语句:
...unsigned char chbuf[4] ={0};int a =23534;memcpy(chbuf,&a,4);char hexStr[9]={0};/*转换*/for(int i=0; i<4; i++){ sprintf(hexStr+i*2,"%02X",chbuf[i]);}//输出 ...
这时,在sprintf中, “%02X” 对应的参数应为1Byte的数据类型变量(如:unsigned char)。
发现问题
如果将上面的sprintf中, “%02X” 对应的参数应为1Byte的数据类型变量,传入一个存储空间大于1Byte类型的变量(如:int),会怎么样呢?
事实是,传入int类型也是可以的,如传入一个叫 iValue的变量,只有当0< iValue <255 时,转换后存储空间存入数据正常;
下图是一个错误的内存信息(其中一次转换的结果):
从调试信息可以看出,在temp等于 -28 时,一次转换后buf里的内存有8Byte都被改写了(图中内存 红色 数字为本次内存被修改的数据)。正常时一次buf里写入2Byte数据,也就是说有6Byte内存空间被意外改写。
测试确认
下面为用VS2010环境里写的测试该问题的小程序(用随机数生成UUID):
#include<iostream>#include <ctime>using namespace std;int main(){ unsigned char buf1[4] ={0}; int a =23534; memcpy(buf1,&a,4); char buf[33]={0}; char bufStr[10]={0}; srand(time(0)); int temp; //越界测试 for (int num = 0; ;num++) { for (int i =0;i<16;i++) { /*正确用法*/ //sprintf(bufStr+i*2,"%02X",buf1[i]); /*传参值大于“%02X”的合理值 会导致越界写数据*/ //范围控制不当 //temp = (1+(int)(300.0*rand()/(RAND_MAX+2.0))); //temp = (1+(int)(300.0*rand()/(RAND_MAX+2.0)))-150; temp = 1+(int)(300.0*rand()); sprintf((buf + i*2),"%02X",temp ); //范围控制正确 //sprintf((buf + i*2),"%02X", (1+(int)(255.0*rand()/(RAND_MAX+2.0)))); } int len =strlen(buf); if (len>32) { std::cout<<"NO"<< num <<": 越界(" << len << ") -> \t"<<buf<<std::endl; buf[32]='\0'; std::cout<<"NO"<< num <<": 字符串修正) -> \t"<<buf<<std::endl; system("pause"); std::cout<<std::endl; } } }
部分结果截图:
1)数值有概率性的超出范围:
2)数值直接超出范围:
结论
使用sprintf 中二进制转换16进制(“%02X”)时,传入参数要在char型的范围内;同理,在做其他的转换时,对应的参数要在合理的范围内,否则可能发生内存的改写,影响附近内存块的数据安全。
快速导航 >>
- sprintf 02X 导致越界修改内存
- 前言
- 发现问题
- 测试确认
- 部分结果截图
- 结论
0 0
- sprintf 使用不当越界修改内存
- 又一种内存越界的情况, 野指针导致sprintf函数内存越界
- simple_html_dom使用不当导致的内存泄漏
- 常见的内存使用不当的情况
- ABMultiValueCopyLabelAtIndex使用不当引起的内存泄漏
- TransitionDrawable使用不当导致内存泄露
- ABMultiValueCopyLabelAtIndex使用不当引起的内存泄漏
- Hashset 使用不当引起的内存泄漏
- Messenger使用不当导致的内存泄漏
- sprintf()会造成越界错误
- 内存越界
- 内存越界
- 内存越界
- 内存越界
- 内存越界
- 内存越界
- 内存越界
- 内存越界
- 线程池ThreadPoolExecutor的使用和有关ThreadFactory和thread等粗解
- 微信支付的那些坑
- Java中,logger.debuge是什么意思?有什么作用?
- 启动和停止Java应用程序的Shell脚本
- 遍历map集合
- sprintf 使用不当越界修改内存
- MFC 获取当前工作路径和可执行文件路径
- Wireshark和TcpDump抓包分析心得
- 使用文件IO操作GPIO SysFs方式
- 练习:Trie树(公共前缀)
- source insight打开samba共享的工程时,界面闪烁问题
- Journal工作原理
- Xcode中git的使用
- git-rebase 超级详细讲解,我竟然看完了