一个unsigned和signed的漏洞
2015-05-22 21:42
148 查看
最近有一段时间没有写博客了,一直在刷CSAPP,今天在chapter2看到了一个有趣的小故事,特来分享。
在FreeBSD中的getpeername库中,有以下一段C代码(简化后)
这段程序的意思是把内核中的部分内容复制到一个面向用户的数组里面。
而当年的程序员忽略了size_t在C中定义为无符号整数,如果输入maxlen为负数的话,则maxlen作为形参传入memcpy中的时候会成为一个非常大的无符号整数,从而造成内核崩溃和溢出攻击。
因为无符号和符号数之间的转换造成的bug层出不穷,所以非必要还是统一有符号整数比较好。
在FreeBSD中的getpeername库中,有以下一段C代码(简化后)
void memcpy(void *dest,void *src, size_t n); #define KSIZE 2014 char kbuf[KSIZE]; int copy_from_kernel(void *user_dest, int maxlen){ int len=KSIZE<maxlen?KSIZE:maxlen; memcpy(user_dest, kbuf, len); return len; }
这段程序的意思是把内核中的部分内容复制到一个面向用户的数组里面。
而当年的程序员忽略了size_t在C中定义为无符号整数,如果输入maxlen为负数的话,则maxlen作为形参传入memcpy中的时候会成为一个非常大的无符号整数,从而造成内核崩溃和溢出攻击。
因为无符号和符号数之间的转换造成的bug层出不穷,所以非必要还是统一有符号整数比较好。
相关文章推荐
- 编写一个程序以确定分别由signed及unsigned限定的char、short、int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现
- 请编写一个c程序确定signed,unsigned的char,short,int和long变量取值范围
- 练习 2-1 编写一个程序以确定分别由 signed 及 unsigned 限定的 char、short、 int 与 long 类型变量的取值范围。
- 编写一个程序,分别以signed和unsigned限定的char、short、int与long类型的变量取值范围
- MySQL unsigned默认显示字符宽度比signed少一个
- c++基础类型之signed、unsigned的一个细节
- 练习2-1 编写一个程序一确定分别由signed及unsigned限定的char,short,int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现。通过直接计算来确定浮点类型的取值范围是一项难度很大的任务。
- 一个C语言中unsigned和signed的汇编不同的插曲
- 一个用c#写的扫描asp源码漏洞的应用程序(续)
- IE6的一个很老的漏洞
- ”将一个unsigned long 型的IP转换为字符串类型的IP “ 解释
- 案例分析---我是如何在谷歌财经发现一个XSS漏洞
- 目前国内一些Web mail存在的一个安全漏洞
- 黑客利用微软公司IE10浏览器的一个未知漏洞发起了新的攻击
- TamperIE - 一个小巧的XSS漏洞检测辅助工具
- signed和unsigned的比较
- 微软发现Java虚拟机的一个漏洞
- 【10.21总结】一个渗透测试练习实例——发现未知的漏洞(Race condition)
- 打印signed 及unsigned限定的char short int 及long类型变量的取值范围
- 一个典型的sql注入漏洞