




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、安全编程技术系列讲义但y郭克华)有趣的整数溢出ChinaSEl 鵲篇郭克华所有作品由ChinaSEI独家发布。 网址为:如果有文字等小错,请多包涵。在不盈利的情况下,欢迎免费传播。 版权所有郭克华本讲义经过修正、扩充,由清华大学出版社出版。详细可査询 htt|K、v、v、vchiiiaiMibcom/51834整数溢出.1整数的存储方式几乎所冇的高级语言中都冇整数的概念。一个整数,在计算范围内,是内存中的一个变 鼠,也是一个没有小数部分的实数。在不同的系统中,整数存储的方式各不相同。以mt为 例,在Turbo C中,一个整数用2个字节(16位)存放;在某些C编译器(如DevC+)屮,整 数用4
2、个字节(32位)存放:在血语言中,一个整数用4个字节(32位)存放。为了简便起 见,这里谈到的整数特指是在用4个?节存放的32位整数。不过,很多语言屮刈J:整数还 有其他的数据类型,如:丁 字节整数byte:J 短整数short;丁 长整数long;丁 无符号整数unsigned:等等。相关内容,大家根据不同语言来參考相关碍本章如果没冇特别提一般所述是int 型整数。在实际使用的过程屮,人们经常使用的整数表达(编码)方式是10进制,因此,通常用 10进制來表示整数。但是计算机不能直接处理10进制,所以在计算机屮,整数以2进制进 行存储。但是,2进制又A长,不好表达,因此,冇时候又用16进制表示
3、,因为2进制和 16进制能够很方便地转换。対有符号的整数,在32位系统卜,正数的存储方式就是其二进制,如2,在内存中 的存储方式为:00000000 00000000 00000000 0000001016进制衣示为:0x00000002负数的存储一般足比补码(绝对值取反门)。如2的存储方法足;首先取绝对值,2,存储方式为:00000000 00000000 00000000 00000010取反,成为:11111111 11111111 11111111 11111101加1,成为:11111111 11111111 11111111 1111111016进制农示为:OxFFFFFFFEu-
4、般说來,如果最高位置1,这个变录就被解释为负数;如果置0,这个变就就解禅为 正数。还有一种是无符号整数,不管最高位是1还是0.都理解为正数。如:11111111 11111111 11111111 11111110如果理解为无符号类型,将是一个很人的数。.2整数溢出什么情况卜会出现整数溢出呢?由J整数在内存里面保存在一个周泄长度(在本章中使用32位)的空间内,它能存储的 最人值就是固定的,当尝试去存储一个数,而这个数又人J这个固定的最人值时,将会导致 整数溢出。举个例子,有两个无符号的整数,numl和num2,两个数都是32位长,首先赋值给numl 一个32位整数的最人值,num2被赋值为1。
5、然后让numl和num2相加,然后存储结果到 第3个无符号32位的整数nuni3,代码如卜:numl = OxFFFFFFFF;nuni2 - 0x00000001;mim3 = num + niim2;很显然.numl 的值是:11111111 11111111 11111111 11111111:nuni2 的值是:00000000 00000000 00000000 00000001:两者相加,得到结果为:00000000 00000000 00000000 00000000。因此,nuinJ屮的值 是0,发生了整数溢出。此时,如果一个整数用來计算一些敏感数値,如缓冲区人小或数组索引,就
6、会产生潜在 的危险。不过,并不是所有的整数溢出都町以被利用,毕竟,整数溢出并没有改写额外的内存; 但是,在仃些情况卜整数溢出将会导致"不能确定的行为”,山整数溢出出现Z后,很 难被被立即察觉,比较难用一个冇效的办法去判断是否出现或者可能出现整数溢出。就发现的难度而言,和缓冲区溢出相比,整数溢出更加难被发现。因此 即使是审核过 的代码,有时候也难以幸免。综上所述,一言以蔽Z,整数溢出是尝试存储一个很人的数到一个变磺中,由J这个变 啟能够存储的数值范丽人小,不足以存储那个很人的数,造成溢出。卜面用最简单的程序來 说明这个问题(使用的环境是DEVC+,用户也可以使用TurboC,稍冇不同)
7、:P02_08.cinclude <stdio.h>int mam(void)mt 1;short s;chai c;1 = Oxdeadbeef;S = l;C-l;pnntf(,rl=Ox%x(%d bytes)", L sizeof(l); pnntf(,ts=Ox%x(%cl bytes)®", s, sizeof(s); pnntf(Hc=Ox%x(%d bvtes)nM, c, sizeof(c); letuin 0;生成可执行文件,运行显示:l=0xdeadbeef <4 bytes> s=0xFfffbeef<2 by
8、tes> c=0xfF£fF£ef Cl bytes >如前所述帑数溢出并不像普通的漏洞类熨,一般不会允许直接改写内存。但是一个精 门的设计町以宜接改变程序的控制流程,程序员此时很难令办法在进程里ihi检査计算发生后 的结果,帯给用户的感觉就是:计算结果和正确结果ZMJ,仃一定的偏差。此种攻击般的 方法是:攻击者强迫个变彊包含错谋的值,从而在后而的代码中出现问题。G卜而的例子:P02_09.c禅include <stdio.li>#mclude <stnng.h>int niam(int argc, chai *argT)unsigned
9、 short s;hit i;chai bufflOO;1 = atoi(argvl);s = i;if(s >- 100)prmtfC*拷贝字节数太人,请退出!n”);retiun -1;memcpy(buf, argv2, i);bufli = 9;pnmfV'成功拷贝d个字节n”, 1);retiun 0;该程序的作用足将aigv2的内容拷贝到buf中,由aigvl指定拷贝的字节数,在程序 中,进行了相对严格的人小检査:如果argx-l的值大等J: buf数组的犬小(100),则不进 行拷贝。生成可执行文件,运行:>P02_09 2 hello显示:拷贝2个字节完全正
10、常。运行:>P02_09 1000 hello显示rm该程序看似正常,但是输入:程序显示:该程序屮,程序从命令行参数中得到一个整数值存放在整形变斎1当中,然后这个値被 赋予unsigned short类型的整数s,由J: s在内存中是用16位进行存储,16位能够存储的最 人数是:11111111 11111111即:十进制的65535,因此,unsigned short存储的范|:冃是065535.如果这个值人unsigned short类型所能够心储的值65535.它将被截新。因此,输入65536,系统会将其认 为0,因为65536的二进制是:1 00000000 00000000系统
11、只取后面16位进行存储。实际卜.,整数溢出的危害还在r能够产牛“并发攻击”,类似门矢学中的“并发症”。以 上佃的例子为例,程序绕过代码中的人小判断部分的边界检测,乂町以导致缓冲区溢出,只 要使用一般的栈溢出技术就能够利用这个溢出程序。卜而的例子列举了另外几个出现问题的运算:P02_10.cinclude <stdio.h>int mam(int argc. chai *aigv)mt nl =nit 112 - 0x40000000;mt n6 = OxSfffiff;卩门!1敢"(0*%*)+1=%«0“只)11", nl, nl, nl+1. nl
12、+1);pmitff'%d(0x%x)+%d(0x%x)=%d(0x%x)n", n2.112,112,112, n2+n2, n2+n2); printf(',%d(0x%x)*4=%d(0x%x)nM, n2, n2, n2M, n2*4);pmitfV'%d(0x%x)d(0x%x)d(0x%x)ir, n2,112,116, n6. n2-n6. n2-n6); retuin 0;生成可执行文件,运行,得到如下结果:2147483647C0x7fffffff)tl=-2147483648C0x80000000>1073?41824<0x40
13、000000>*1073741824<0x40000000> =-2147483648 C0x80000000>107374ie24COx40000000>*4=0<0x0>1073741824<0x40000000>1879048193<0x8FfFfffF>=-1342177279<0xh0000001>以匕显示的棊本上是可以被攻击者利用的一马运算。很显然,这些不正常的结果都是由整数溢出引起的,读者可以自己分析其原理。 整数溢出还勺町能在动态分配内心时被利用。看如卜代码:P02.11Cinclude <st
14、dio.h>禅include <stdlib.li>mt* anavcpy(uit *airay. mt len)mt *newanayw i;newaiiay = nialloc(len*sizeof(mt);pnnR”为 ncwanay 成功分配(1 了节内存n”上n*sizeof(int); iffnewairay = NULL)return -1;priiitfC'循环运彳亍次数:d(Ox%x)n",len,len);for(i = 0; 1 < len; i+)newairavi = ariayi;retuin newarray;mt mam
15、(int aigc, cliar *argv)mt airay = 12345;aiiaycpy(anay,atoi(aigT 1 );return 0;该代码将arrav拷贝到nexvaiiav中,生成exe文件,运彳:>P02_11 5显示:叮n e zy祝功弁配2 8 再环运行决数t 55x5看似没令问题。但是如果输入卜面的命令:>P02 _11 1073741824我们知道,1073741824的16进制是0x40000000 ,从前一个例子可以看出, 0x40000000*4=0x0o因此,屏幕上显示:ne war pa v-T1 內存循坏运行次数二 1073 74182
16、4<0x49000000>很显然,这个看起来没令问题的函数町能出现在没仃为newanay分配内存的情况卜S 却向其里面拷贝数组元索,循环的次数还非常欽严电时造成系统崩溃。攻击者通过选择一 个合适的值给leii可以使得循坏反复执行导致缓冲区溢出。还有一种情况,通过改写malloc的控制结构,也能够在正常的函数运行的过程屮插入 其他可执行恶意代码。P02_12cinclude <stdio.h>#mclude <stdlib.h>mt catstimg(cliai *bufl, cliai *bu£2, int lenl, mt len2)chai m
17、ybuf256;if(lenl + len2) > 256)超出 mybuf 容纳范return -1;memcpy(mybuf, bufl, lenl);memcpy(mybuf + lenl, bu£2. Ieu2);pnmff 复制d+%dd 个字节到 rnybuf nMJen 1 ,kn2Jen 1 +kn2); retuin 0;mt mam(mt aigc, chai *argr)catstimg(aigvl,aigf2,atoi(aigvF3),atoi(aigv4);return 0;该例子看起來无懈可击,并L进行了 bnl和13相加Z后的检他 输入:>P02_12 China Hello 3 4显示:复制3 T刃个字节到mybuf输入:>P02_12 China Hello 100 300眾示:这看起来正常,但是如果输入:>P02_12 China Hello 2147483647 12147483647的16进制为Ox7FFFFFFFo该运行结果为:程序崩溃。根本不会显示:”超出myb
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园数学社会责任试题及答案探讨
- 幼儿园数学启示教育试题及答案
- 眼解剖学试题及答案
- 有理数单元测试卷及答案
- 英语四级笔试试卷及答案
- 社工热点面试题及答案
- 义乌数学三年级试卷及答案
- 一年级思维试卷及答案
- 家具设计中如何运用曲线美学试题及答案
- 深入探讨土木工程自然灾害影响评估的相关试题及答案
- 机动车维修竣工出厂合格证样式
- 幼儿园中班歌唱:《母鸡孵蛋》 课件
- GB/T 36447-2018多媒体教学环境设计要求
- GB/T 14832-2008标准弹性体材料与液压液体的相容性试验
- 电机检测报告
- 内镜下逆行阑尾炎治疗术
- SJG 82-2020 政府投资学校建筑室内装修材料空气污染控制标准-高清现行
- 《脂蛋白(a)与心血管疾病风险关系及临床管理的专家科学建议》(2021)要点汇总
- 2004年武汉房地产市场情况分析报告(共23页)
- 肿瘤化学治疗
- RMG88.62C2控制器报警显示及可能的故障原因 - 副本
评论
0/150
提交评论