首页
社区
课程
招聘
[讨论]用sscanf()把十六进制字符串转化成数值可能导致的溢出问题
发表于: 2008-11-15 21:22 12132

[讨论]用sscanf()把十六进制字符串转化成数值可能导致的溢出问题

2008-11-15 21:22
12132
main()
{
   unsigned char s[]="DEADBEEF";
   unsigned char *p;
   int n, i;
   n = strlen(s)/2;
   p = (unsigned char *)malloc(n);
   for(i=0; i<n; i++)
      sscanf(s, "%02X", &p[i]);
   /* 使用数组p */
   free(p); /* 这里产生异常,因为内存块被破坏 */
}
跟踪了一下发现,"%02X"这个格式转化出来的值的类型是int,
而且它会把后面的变量当成int来处理,但是
在VC++中,长度为4个字节,而不是1个字节。假定p=1000,
于是在循环过程中,p所指的内存块发生如下变化:
+1000 0xDE
+1001 0x00
+1002 0x00
+1003 0x00 第1次循环时,实际上4个字节都被赋值

+1001 0xAD
+1002 0x00
+1003 0x00
+1004 0x00 第2次循环时,地址1004中的内容被破坏,该地址不在所分配的内存范围内

+1002 0xBE
+1003 0x00
+1004 0x00
+1005 0x00 第3次循环时,地址1005中的内容被破坏,该地址不在所分配的内存范围内

+1003 0xEF
+1004 0x00
+1005 0x00
+1006 0x00 第4次循环时,地址1006中的内容被破坏,该地址不在所分配的内存范围内

所以,整个循环完成后,有3个字节的内存单元被破坏。
如果一定要用sscanf()来转化的话,又不用中间变量的话,有没有什么办法?
格式中我找了一下只有"%02hX",这个短整型,也没有用。
实在不能用sscanf()的话,有没有其它替代函数?不想自己编函数来实现。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
for(int i=0;i<...;++i){
int n;
sscanf(...,&n);
p[i]=n;
}
2008-11-27 15:01
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
既然已经确定 sscanf 至少需要一个短整型的内存空间来接收结果,那么只有2个办法:
1.分配一个短整型来接收结果,然后存入目标变量
2.自己写一个,其实这也很快.
2008-11-28 11:38
0
游客
登录 | 注册 方可回帖
返回
//