实例介绍
如何攻破软件,英文名how to break software。本文为精简版,浓缩就是精华啊。
报错信恳仅仅是迫使程序停止来显示一条报错信息、,然后接着执行卜一条输入或者直到定时 器超时而凵。但是,也有其他一些报错信息则是来自于被程序抛岀和异常处理器被执行引发 的异常。异常处理器(或中央错误处理线程)因其指针突然改变而数据状态不产生相应变化, 通常会存在问题。异常处理器执行的睽间,各种各样的数据问题接踵而至:文件未关闭、内 存未释放、数据未初始化。当控制重新回到主线程,很难判断错误处理器是在什么时刻被调 用,又会有怎样的遗留问题在等待粗心大意的开发人员:因为文件没有关闭导致打开文件失 败、在没有初始化前就开始使用数据。如果我们能确侏在所有的报错信息都出现过之后系统 依然正常工作,那么也算是为用户省去」不少麻烦(吏不用说我们的维护工程师∫) 图1展小∫我的学生在微软Word20中发现的一个有趣的bug,一条错误提小不知为 何连续出现了两次。这个bug是在通过单一输入攻击错误处理线程的过程中发现的 确保软件指定默认值。 开发人员通常不记得在用户输入越界或给参数改置不合理的值时指定默认的值。有时候 强制改立默认值意味着什么也不做一一然而正因为恕不到,这一举措甚至难倒」优秀的开发 人员。例如,在word2000中,如下对话框中有一个选择框,当不对其做任何修改时再次打 开对话框,该控件将消失。对比左右图片中的对话框。你发现什么控件消失了吗? Index and I atles aE Ind and T nhl 图 hdat Tae or Crems I ae ofEr|Bt图 pr PC a ba业 p Hanns J Eening 2 REMTE 2 Stade 3. HAidar 2 Heads P Eghk dg pae numbers T-n k 有的时候指定默认值需要先改变值的当前设定,然后将其设定为个不合理的值。这种 连续的转换保让了再转换成其他可用的值前是经过设置默认值 尝试输入变量的所有可用的字符集 有的输入问题很简单,特别是当你使用了类似$,%,#,引号等等字符付,这些字符在 许多编程语言中有特姝意义并且作为输入被读入时通常需要特姝处理。如果廾发人员未考虑 这种情况,则这些输入可能导致程序的失败。 通过改变输入内容的多少引发输出区域的改变 聚焦丁输出木身是一神发现bug颇有成效但是极少使用的方法。其思想是:先假定一种 表现为bug的输出或者行为,然后寻找能够导致这种现场产生的输入。以上所述的一个简单 的攻击例子就是通过改变输入值和输入字符串的长度来引发输出区域大小的重新计算。 个很好的概念性例子是将时钟的时间设置为9:59,然后等待它转到10:00。一开始显 示区域是4个字符长度而后来是5。反过来,我们设定时间为12:59(5个字符),然后等待 其转变为1:00(4个字符)。开发人员通常只会对初始化为空白的情况进行处理而不曾考虑 到显小区域己有数据的情况下如何史新该区域以显小不同长度的数据。 举个例子, PowerPoint中的“艺术字”功能中有个有趣的bug。假定我们输入下图中的 个长的字符串 可以发现因为字符串太长,并不是整个字符串都能显小出来。但这不是问题的关键。点 击确认按钮时触发两个事件。首先,程序计算岀需要的输岀区域大小,然后将输入的文字填 充进去。现在,我们编辑该字符串,将它改为单个字符。 可以发现尽管现在只有单个字符,字体大小也没有改变,但显小区域大小却没有发生改 变。进一步看。如果冉次编辑该字符串为多行的字符串,输出结果更有意思、。 E Microsoft PowerPoint-[Presentotion1I 回E= Fdit iAv Tns+ Form=t工 hls li smw inimw Hen l可x 回的品“口27%-2 ⊥□ ATTENTON Microsoft Inter Job interviews Career Go to room 210 ae for all god mene come to the aid 回 Eile Edit iaw Insert Forst Tools Slide show MA. in+y出 1型x」 10ATTENTION ob interviews held in Career se Go to room 20 Keuper Bldg C Microsoft Powerpoint [Presentational UJEil- Edit yiw Insert For mat Inns Slide Show Mlinrnw Hen 回x 当鹛5x:+兽当279 1 ATTENT工ON Microsoft intern held in Career se Go to room Keuper Bld 一分也Aa的≡ 我悲这部分凵经介绍得比较清楚了,我们将进入卜一部分 确保对显示区域的边界的检査。 这是基于输出的另一种攻击思路,与之前的|分类似。然而,不同于之前着力」导致显 区域内部出错,这次我们将精力集中在显示区域的外部。并且显示区域将不再重新计算显 示边芥而仅仅是考虑边界溢出。 再以 Power Poin为例,我们可以先画一个文木框,然后输入一个带上标的字符串。放 大该字符串的宇体使上标的上半部分被截断。这一问题将连同之后的相关问题一起说明。 引发屏幕刷新问题。 这是使用 windows图形用户界面的用户会遇到的主要问题。对开发人员来说,史是 个大问题:过度的刷新将导致程序变慢,而不刷新又会导致大大小小的问题,小至要求用户 强制刷新,大到导致用户的操作失败 通常通过在屏幕上添加、删除和移动元素来触发血刷新。这将导致背景車新绘制,如 果贞面不能正确、及时地作出相应,那么这就是通常意义上的bug。其中,尝试变化所移动 的元素的距离是一种较好的方式,可以移动一点点,接着移动一大截,移动一两次,接着移 动很多次 接着说回上面例子中的带上标的字符串,试着每次用鼠标拖动它移动一些距离,就会发 现令人讨厌的问题,如下图所示。 在 Office2000中 →4引丝常出现的另一个与 L口 ATTENIION Mcr。 tk Intern 屏幕刷新相关的问题 lob interview ar held in Cae se 是文本的异常消失。 Go to noon 210 25 Keuper Bdg 这一讨厌的问题在 word的页面边界附近 4 出现。 Click to add notes 输入值组合攻击 口的 rcm如南哪、、口四面、,凸,画■翻 第二类输入/输出 Side S 0f 6 Bur Desn bug主要针对多个共 同作用或相互影响的输入。例如,一个通过两个参数调用的API,其中一个参数的取值建立 在另一个参数取值的基础上。通常,bug正是出在值组合上,因为代码的逻辑关系复张。 找出不能共存的输入值的组合。 那么哪些值的组合是有问题的?这个问题目前还处于积极研究中,但是我们已经找到了 一个特别有效地方法,那就是先确定期望获得的输岀,然后试着去找到对应的输入值的组合。 尝试产生无效的输出。 这是一种适用于测试人员对问题域十分清楚的有效攻击方法。例如,当你在测试一个计 算器并且清楚部分功能点的结果有限制时,试图找到超岀范围的结果所对应的输入值组合是 值得的。但是,如果你不熟悉数学,那么这种努力很可能是浪费时间一一你甚至可能将一个 不正确的结果当成正确的。 有时候 windows木身会给出提示,告诉你哪些输入是相互关联的。此时,测试人员可 以去测试这些值的范围,并且尝试触犯既定的关系。 输入序列攻击 软件中的输入就像一种止式的语言。单一的输入相当」组成语言的字母,输入的字符串 类似构成语言的句子。其中一些句」应该通过控件和输入区域的启用与禁用被过滤。通过尽 可能多地输入字符串、改变输入的顺序来测试这种问题 选择导致无效输出的输入序列。 和上文描述这是一种找到问题输入组合的好方法一样,这同样是找出有问题的输入序列 的好方法。例如,当我们发现∫Oice2000中的一个导致文本消失的问题后,对 Power point 幻灯片中标题文本框进行攻击。如下的一组屏幕截图冉现∫一个特定的输入序列是如何导致 文本消失的。 正回国wF E和 Eai swa. wart Frat m ao sty oran 阳 mrt ma Dect ilt sow如mh DdF)…gB5:h 1感 ATTLATI0H 1b粪 ITtNTION 1直 ITHNTION MicosofT I nter Microsoft Imt把 MIcroset Iotel C xn caos ATHENTION Go tD roMm 2 门rN GatD fosT丑 Micros af lrtenigvee KHr段h Mirswios bereit Kere Ed Cm取 曰BD 日要!比 b and ncos r宝tams 7 m· R6 anime)s□42正△=a面 口日压= 日日2▲·=量 有趣的是仅仅将文本框旋转180度并不能发现这个bug。必须按照这样的操作顺序:旋 转180度后,再旋转10度(或者更多)。逆向执行以上操作并不能修正这一问题,每当点山 标题外部区域,该标题内容就会消失。 改变输入的顺序之所以善于发现bug是因为很多操作自身成功执行的同时会遗留很多 问题,它们将导致之后的操作失败。对输入序列进行彻底的检査会暴露出很多这样的问题。 然而有时侯,下面这种攻击表明:为了发现bug,根本不需要使用多种多样的输入序列 多次重复同样的输入序列。 这种方式会对资源造成大规模占用,并且对存储数据空间造成压力,当然也包括发现其 他负面的遗留问题。遗憾的是,大多数应用程序并不清楚自身空间和时间的限制,而许多开 发人员倾向于假定资源总是足够可用的。 在Word的公式编辑器中可以找到这方面的一个例子,程序本身似乎并不清楚它只能处 理10层嵌套括号的计算 数据攻击 数据是软件的命脉;如果你设法破坏了它,那么程序将不得不使用被破坏的数据,这之 后得到的就不是合理的结果。所以理解数据是如何、在何处建立是必要的 从本质上讲,数据的存储是通过读取输入,然后将其存储在內部或者存储一些內部计算 的结果来实现的。因此,测试正是通过提供输入和执行计算来实现数据在应用程序中的传递 数据攻击遵循以下简单原则。 数据攻击 变量值攻击 1存储不正确的数据类型 2使数据值超过允许的范围 数据单元大小攻击 3.溢出输入缓冲区 4存储过多的值 5存储太少的值 数据访问攻击 6找出同一数据的不同修改方式 变量值攻击 这一类的攻击需憂对内韶存储的数据对象的数据类型和合法值进行检查。如果有对源码 的权限则这些信息可以轻易得到,但是,通过小小的探索性测试和对错误信息的关注也可以 确定人致的类型信息。 改变输入的数据类型来找出不匹配的类型。 在需要整数的区域输入字符(和类似的攻击)已经被证明十分有效,但随着现代编程语 言对类型检查和类型转换的处理变得容易,我们发现这样的攻击相对之前已经不再那么有 效 使数据值超过允许的范围。 被存储的变量数据和输入的变量数据一样,这样的攻击方式同样适用 数据单元大小攻击 第二类数据攻击旨在蝕发数据结构的溢出和下溢。换句话说。攻击试图打破预先设定的 数据对象的大小限制。 首先要说的就是典型的缓冲区溢出。 溢出输入缓冲区。 此处通过输入长字符串导致输入缓冲区溢出。这是黑客们偏好的攻击方式,因为有时候 应用程序在崩溃之后会继续执行进程。若一名黑客将一段可执行代码附在一个长字符串中输 入,程序很可能执行这段代码 在Word2000的一个缓冲区溢出问题就是这样一个可被利用的bg,此bug被发现在 査找/替换玏能中,如下所示。有趣的是,“查找”这一字段被合理地加以限制而“替換”没 有 正出面 同一数据结构 存储过多的值。 复杂地数 据结构诸如数 组、矩阵和列表 在测试中不仅 仅要考虑存储 8 在其中的数值, 还要考虑存储 值的数目。 同一数据结构 存储过少的值。 当数据结 4正A日国重 构允许增加和 删除信息时,通 常在做了n-1次增加的同时穿插着或在其之后做n次删除操作会导致攻击成功。 数据访问攻击 我的朋友 Alan Jorgensen喜欢用“右手不明左手所为”这句话来形容这一类bug。道理 很简单,但开发人员却常倒在这一类攻击下:在很多程序中通常任何任务都能通过多种途径 完成。对测试人员来说,这意味着同一个函数可以由多个入口来调用,这些入口都必须确保 该函数的初始条件得到满足。 个极好的例子是我的学生在 PowerPoint中发现的表格数据大小相关的崩溃性bug。创 建表格时最大尺寸被限定为25×25。然而,可以创建一个25×25的表格,然后为其添加行 和列——导致应用程序崩溃。这就是说,程序一方面不允许26×26的表格存在而另一方面 却并不清楚这个规则的存在。 运算攻击 运算攻击 操作数攻击 使用非法操作数进行运算 找出非法操作数组合 结果攻士 使运算结果过大 使运算结果过小 功能相互作用攻击 找出共亨数据不佳的功能 操作数攻击 这类攻击需要知道在一个或史多内部运算中操作数的数据类型和可用的值。如果有源码 权限则这些信息可以轻易获得。否则,测试人员必须尽最大努力去弄清楚正在进行的运算只 体是什么、使用的是什么数据类型。 触发由非法操作数引起的运算。 有时侯输入或存储的数据处于合法的范围之中,但是在某些运算类型中却是非法的。被 0除就是一个很好的例子。0是一个合法的整数,但作为除法运算的除数却是非法的。 找出不能共存的操作数的组合。 涉及到一个以上操作数的运算不仅受制于上面的攻击,同时存在操作数冲突的可能性。 结果攻击 第二类运算攻击旨在造成存储运算结果的数据对象的溢出和下溢 试图造成运算结果过大而存储失败。 就算是简单如y=x+1这样的运算在数值边界上也常出问题。如果x和y都是2比特的 整数并且ⅹ的值为32768,则这一运算将失败,因为结果将会造成存储溢出。 试图造成运算结果过小而存储失败 和上文相同,不同的是使用y=x-1并且使x的值为-32767 功能相互作用攻击 文章中讨论的这最后一类攻击或许算是所有种类的鼻祖,可以用来区分测试菜鸟和专业 人员:功能的相互作用。问题没有什么新意:不同的应用程序功能共享同一数据空间。两种 功能的相工作用导致应用程序失败,不是因为对数据处理的设定不同,就是因为产生了不良 副作用 但是哪些功能共享数据并且能够在冲突情况下实现数据转化口前还是测试领域中一个 开放的问题。日前我们正停留在不断地尝试阶段。下面这个例子足以说明情况 这个例子给出了在Word2000中的同一页面上合并注和双列时出现的一个出人意料 的结果。问题在于:Word从注释的引用点计算脚注的页面宽度。所以,若同一页面上存在 两条脚注,一条被处于双列位置的内容所引用,另一条则被处于单列位置的内容所引用,单 列脚注公将双列脚注挤到下一页面。同时被挤掉的还有引用点至页面底部间的文本。 三萨三 下面的屏幕 截图形象地 说明」问题。 第二列的文 木去哪里 ∫?连同脚 如三签 注一起处在 n远aoh1M黑 下一次你会 任由文档像 1=11 aata Ln1a回下111D 这样显小 吗?在找到解决方法(这意味着你得花时间去整理)前你将不得不忍受这一现状 结论 简单遍历—遍上面罗列的21种攻击策略叮以覆盖应用程序的大部分功能。事实上,施行 次成功的攻击通常意味着尝试各种可能性,走过很多死胡同。但是仅仅因为部分这一类探 索性方法发现不了bug并不意味着它们没有用。首先,这段吋间使用应用程序帮助测试人员 熟悉程序的各种功能,从而产生新的攻击思路。其次,测试通过是好的消息!它们表明, 品是可靠的:尤其当这组测试是上面所说的恶意攻击。如果代码可以承受这样的测试过程, 它儿乎可以应对用户作出的任何操作。 另外,永远不要低估了测试时怀揣一个具体目标的作用。我见过太多测试人员把时间浪 费在亳无目的地输入或者随机地调用API试图导致软件出错。实行测试意味着制定明确的目 标一一基丁会出错的点—一然后设计测试用例来实践该目标。这样,每个测试用例都有目的 泩并且进度可以被随时控制。 最后,记住,测试应该是有趣的。攻击这一比喻正是对测试的这一特性很好的诠释并且 还为愉快的消遣时光添加∫些许作料。狩猎愉快 【实例截图】
【核心代码】
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论