您好、欢迎来到现金彩票网!
当前位置:大发体育在线 > 指令栈 >

软件漏洞分析入门_3_初级栈溢出B_系统栈原理

发布时间:2019-06-10 17:13 来源:未知 编辑:admin

  上节课我们用越过数组边界的一个字节把邻接的标志变量修改成0,从而突破了密码验证程序。您实验成功了吗?没有的话回去做完实验在来听今天的课!

  有几个同学反映编译器的问题,我还是建议用VC6.0,因为它build出来的PE最适合初学者领会概念。而且这门课动手很重要,基本上我的实验指导都是按VC6.0来写的,用别的build出来要是有点出入,实验不成功的话会损失学习积极性滴——实验获得的成就感是学习最好的动力。

  今天基本没有程序和调试(下一讲将重新回归实践),主要是一些理论知识的补充。听课的对象是只用C语言编过水仙花数的同学。如果你不是这样的同学,可以飘过本讲,否则你会说我罗嗦滴像唐僧~~~~我的目标就是一定要让你弄明白,不管多罗嗦,多俗气,多傻瓜的方法,呵呵

  找工作滴同学也可以看看这部分,很可能会对面试有帮助呦。根据我个人无数次的面试经验,会有很多考官饶有兴趣的问你学校课本上从来不讲的东东,比如堆和栈的区别,什么样的变量在栈里,函数调用是怎么实现的,参数入栈顺序,函数调用时参数的值传递、地址传递的原理之类。学完本节内容,您将对高级语言的执行原理有一个比较深入的认识。

  此外,这节课会对后面将反复用到的一些寄存器,指令进行扫盲。不要怕,就几个,保管你能弄懂。

  根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行。但是不管什么样的操作系统、什么样的计算机架构,进程使用的内存都可以按照功能大致分成以下四个部分:

  代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域来取指并执行。

  堆区:进程可以在堆区动态的请求一定大小的内存,并在用完之后归还给堆区。动态分配和回收是堆区的特点

  栈区:用于动态的存储函数之间的调用关系,以保证被调用函数在返回时恢复到母函数中继续执行

  注意:这种简单的内存划分方式是为了让您能够更容易地理解程序的运行机制。《深入理解计算机系统》一书中有更详细的关于内存使用的论述,如果您对这部分知识有兴趣,可以参考之

  在windows平台下,高级语言写出的程序经过编译链接,最终会变成各位同学最熟悉不过的PE文件。当PE文件被装载运行后,就成了所谓的进程。

  如果把计算机看成一个有条不紊的工厂的话,那么可以简单的看成是这样组织起来的:

  存在代码区的指令则告诉CPU要做什么,怎么做,到哪里去领原材料,用什么工具来做,做完以后把成品放到哪个货舱去;

  值得一提的是,栈除了扮演存放原料,半成品的仓库之外,它还是车间调度主任的办公室。

  程序中所使用的缓冲区可以是堆区、栈区、甚至存放静态变量的数据区。缓冲区溢出的利用方法和缓冲区到底属于上面哪个内存区域密不可分,本讲座主要介绍在系统栈中发生溢出的情形。堆中的溢出稍微复杂点,我会考虑在中级班中给予介绍

  以下内容针对正常情况下的大学本科二年级计算机水平或者计算机二级水平的读者,明白栈的飘过即可。

  从计算机科学的角度来看,栈指的是一种数据结构,是一种先进后出的数据表。栈的最常见操作有两种:压栈(PUSH),弹栈(POP);用于标识栈的属性也有两个:栈顶(TOP),栈底(BASE)

  PUSH:为栈增加一个元素的操作叫做PUSH,相当于给这摞扑克牌的最上面再放上一张;

  POP:从栈中取出一个元素的操作叫做POP,相当于从这摞扑克牌取出最上面的一张;

  TOP:标识栈顶位置,并且是动态变化的。每做一次PUSH操作,它都会自增1;相反每做一次POP操作,它会自减1。栈顶元素相当于扑克牌最上面一张,只有这张牌的花色是当前可以看到的。

  BASE:标识栈底位置,它记录着扑克牌最下面一张的位置。BASE用于防止栈空后继续弹栈,(牌发完时就不能再去揭牌了)。很明显,一般情况下BASE是不会变动的。

  内存的栈区实际上指的就是系统栈。系统栈由系统自动维护,它用于实现高级语言中函数的调用。对于类似C语言这样的高级语言,系统栈的PUSH,POP等堆栈平衡细节是透明的。一般说来,只有在使用汇编语言开发程序的时候,才需要和它直接打交道。

  注意:系统栈在其他文献中可能曾被叫做运行栈,调用栈等。如果不加特别说明,我们这里说的栈都是指系统栈这个概念,请您注意与求解“八皇后”问题时在自己在程序中实现的数据结构区分开来。

  我们下面就来探究一下高级语言中函数的调用和递归等性质是怎样通过系统栈巧妙实现的。请看如下代码:

  这段代码经过编译器编译后,各个函数对应的机器指令在代码区中可能是这样分布的:

  根据操作系统的不同、编译器和编译选项的不同,同一文件不同函数的代码在内存代码区中的分布可能相邻也可能相离甚远;可能先后有序也可能无序;但他们都在同一个PE文件的代码所映射的一个“区”里。这里可以简单的把它们在内存代码区中的分布位置理解成是散乱无关的。

  当CPU在执行调用func_A函数的时候,会从代码区中main函数对应的机器指令的区域跳转到func_A函数对应的机器指令区域,在那里取指并执行;当func_A函数执行完闭,需要返回的时候,又会跳回到main函数对应的指令区域,紧接着调用func_A后面的指令继续执行main函数的代码。在这个过程中,CPU的取指轨迹如下图所示:

  那么CPU是怎么知道要去func_A的代码区取指,在执行完func_A后又是怎么知道跳回到main函数(而不是func_B的代码区)的呢?这些跳转地址我们在C语言中并没有直接说明,CPU是从哪里获得这些函数的调用及返回的信息的呢?

  原来,这些代码区中精确的跳转都是在与系统栈巧妙地配合过程中完成的。当函数被调用时,系统栈会为这个函数开辟一个新的栈帧,并把它压入栈中。这个栈帧中的内存空间被它所属的函数独占,正常情况下是不会和别的函数共享的。当函数返回时,系统栈会弹出该函数所对应的栈帧。

  在main函数调用func_A的时候,首先在自己的栈帧中压入函数返回地址,然后为func_A创建新栈帧并压入系统栈

  在func_A调用func_B的时候,同样先在自己的栈帧中压入函数返回地址,然后为func_B创建新栈帧并压入系统栈

  在func_B返回时,func_B的栈帧被弹出系统栈,func_A栈帧中的返回地址被“露”在栈顶,此时处理器按照这个返回地址重新跳到func_A代码区中执行

  在func_A返回时,func_A的栈帧被弹出系统栈,main函数栈帧中的返回地址被“露”在栈顶,此时处理器按照这个返回地址跳到main函数代码区中执行

  注意:在实际运行中,main函数并不是第一个被调用的函数,程序被装入内存前还有一些其他操作,上图只是栈在函数调用过程中所起作用的示意图

  每一个函数独占自己的栈帧空间。当前正在运行的函数的栈帧总是在栈顶。WIN32系统提供两个特殊的寄存器用于标识位于系统栈栈顶的栈帧:

  ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶

  EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部

  函数栈帧:ESP和EBP之间的内存空间为当前栈帧,EBP标识了当前栈帧的底部,ESP标识了当前栈帧的顶部。

  栈帧状态值:保存前栈帧的顶部和底部(实际上只保存前栈帧的底部,前栈帧的顶部可以通过堆栈平衡计算得到),用于在本帧被弹出后,恢复出上一个栈帧。

  函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置,以便函数返回时能够恢复到函数被调用前的代码区中继续执行指令。

  注意:函数栈帧的大小并不固定,一般与其对应函数的局部变量多少有关。在以后几讲的调试实验中您会发现,函数运行过程中,其栈帧大小也是在不停变化的。

  EIP:指令寄存器(extended instruction pointer), 其内存放着一个指针,该指针永远指向下一条待执行的指令地址

  可以说如果控制了EIP寄存器的内容,就控制了进程——我们让EIP指向哪里,CPU就会去执行哪里的指令。下面的讲座我们就会逐步介绍如何控制EIP,劫持进程的原理及实验。

  函数调用约定描述了函数传递参数方式和栈协同工作的技术细节。不同的操作系统、不同的语言、不同的编译器在实现函数调用时的原理虽然基本类同,但具体的调用约定还是有差别的。这包括参数传递方式,参数入栈顺序是从右向左还是从左向右,函数返回时恢复堆栈平衡的操作在子函数中进行还是在母函数中进行。下面列出了几种调用方式之间的差异。

  要明确使用某一种调用约定的话只需要在函数前加上调用约定的声明就行,否则默认情况下VC会使用__stdcall的调用方式。本篇中所讨论的技术,在不加额外说明的情况下,都是指这种默认的__stdcall调用方式。

  除了上边的参数入栈方向和恢复栈平衡操作位置的不同之外,参数传递有时也会有所不同。例如每一个C++类成员函数都有一个this指针,在windows平台中这个指针一般是用ECX寄存器来传递的,但如果用GCC编译器编译的话,这个指针会做为最后一个参数压入栈中。

  同一段代码用不同的编译选项、不同的编译器编译链接后,得到的可执行文件会有很多不同。

  返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行

  call 函数地址 ; call指令将同时完成两项工作:a)向栈中压入当前指令在内存中的位置, ; 即保存返回地址;b)跳转到所调用函数的入口地址

  sub esp,xxx ; 设置新栈帧的顶部(抬高栈顶,为新栈帧开辟空间)

  注意:关于栈帧的划分不同参考书中有不同的约定。有的参考文献中把返回地址和前栈帧EBP值做为一个栈帧的顶部元素,而有的则将其做为栈帧的底部进行划分。在后面的调试中,您会发现OllyDbg在栈区标示出的栈帧是按照前栈帧EBP值进行分界的,也就是说前栈帧EBP值即属于上一个栈帧,也属于下一个栈帧,这样划分栈帧后返回地址就成为了栈帧顶部的数据。我们这里将坚持按照EBP与ESP之间的位置做为一个栈帧的原则进行划分。这样划分出的栈帧如上面最后一幅图所示,栈帧的底部存放着前栈帧EBP,栈帧的顶部存放着返回地址。划分栈帧只是为了更清晰的了解系统栈的运作过程,并不会影响它实际的工作。

  在堆栈平衡的基础上,给ESP加上栈帧的大小,降低栈顶,回收当前栈帧的空间

  retn ;这条指令有两个功能:a)弹出当前栈顶元素,即弹出栈帧中的返回地址。至此 ;栈帧恢复工作完成。b)让处理器跳转到弹出的返回地址,恢复调用前的代码区

  不要怪我罗嗦,要彻底的掌握,真正的掌握,完全的掌握缓冲区溢出攻击,这些知识是必须的!讲到这里,如果你思维够敏捷的话,应该已经可以看出我不是无中生有的花这么多篇幅来浪费版面的。

  回忆上一讲的那个例子,buffer后面是authenticated变量,authenticated变量后面是谁呢?就是我废了好多口水讲到的当前的正在执行的函数对应的栈帧变量EBP与EIP(函数返回地址)的值!

  verify_password函数返回之后,程序就会按照这个返回地址(EIP)所指示的内存地址去取指令并执行。

  如果我们在多给几个输入的字符,让输入的数据跃过authenticated变量,一直淹没到返回地址的位置,把它淹没成我们想要执行的指令的内存地址,那么verify_password 函数返回后,就会乖乖滴去执行我们想让它执行的东东了(例如直接返回到密码正确的处理流程)。

  下节课我会带着大家一步一步的完成这节课的分析,让跃过数组的字符串继续跃过authenticated变量,直到把函数返回地址修改成我们想要的值,从而改变程序流程。

  比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。

  比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!

  比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。

  比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。

  比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。

  比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。

  新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。

  比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。

  比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。

  IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。

  X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。

http://cajonbrush.com/zhilingzhan/26.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有