程序溢出的基础及原理.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
程序溢出的基础及原理

程序溢出的基础及原理 一:基础知识 计算机内存运行分配的区域分为3个 程序段区域:不允许写的 数据段区域:静态全局变量是位于数据段并且在程序开始运行的时候被加载 堆栈区域:放置程序的动态的用于计算的局部和临时变量则分配在堆栈里面和在过程调用中压入的返回地 址数据。堆栈是一个先入后出的队列。一般计算机系统堆栈的方向和内存的方向相反。压栈的xx作push= ESP-4,出栈的xx作是pop=ESP+4. 在一次函数调用中,堆栈中将被依次压入:参数,返回地址,EBP。如果函数有局部变量,接下来,就在 堆栈中开辟相应的空间以构造变量。函数执行结束,这些局部变量的内容将被丢失。但是不被清除。在函 数返回的时候,弹出EBP,恢复堆栈到函数调用的地址,弹出返回地址到EIP以继续执行程序。 在C语言程序中,参数的压栈顺序是反向的。比如func(a,b,c)。在参数入栈的时候,是:先压c,再压 b,最后a.在取参数的时候, 指令执行的图例: 指令区域 执行程序区 0 1 2 3 0 4 8 调用100处的函数,参数1(3位),2(10位) C 10 0 1 2 3 100 执行处理 104 108 10C 110 返回调用 堆栈区域 0 1 2 3 如果EBP分配的空间不够xx作就是产生溢出的地方 200 保存以前的EBP4位(数据段的指针,用于可以使用局部动态 变量)现在的EBP等于当前的ESP-动态数据的大小值 , ESP=200 204 0C 00 00 00 此处是程序的返回地址 208 参数1,填充1位 20C 参数2填充2位 210 讲解例子WIN下的程序DEMO,演示参数导致的返回地址的变化 讲清主要4位的填充问题 另外溢出还会导致数据段的改变 3:如何利用堆栈溢出 原理可以概括为:由于字符串处理函数(gets,strcpy等等)没有对数组越界加以监视和限制,我们利用 字符数组写越界,覆盖堆栈中的老元素的值,就可以修改返回地址。 在DEMO的例子中,这导致CPU去访问 一个不存在的指令,结果出错。事实上,我们已经完全的控制了这个程序下一步的动作。如果我们用一个 实际存在指令地址来覆盖这个返回地址,CPU就会转而执行我们的指令。 那么有什么用呢,就算使得我们的程序可以跳转执行一些代码,如何用他来突破系统限制来获得权限呢? 二:系统权限知识 UNIX系统在运行的时候的权限检查主要是根据UID,GID,SID 三个标来检查的,主要根据SID来检查权限 SU系统调用就是SID变成SU的对象 S粘贴位使得运行程序的人具有该程序拥有者一样的权限 中断ROOT的S粘贴位的程序就可以获得超级用户的权限,SID位置没被调用返回修改回来。 VI的S粘贴位可以中断的例子 在UINX系统中,我们的指令可以执行一个shell,这个shell将获得和被我们堆栈溢出的程序相同的权限。 如果这个程序是setuid的,那么我们就可以获得root shell。 三:溢出突破权限的实现 首先要编写SHELLCODE的2进制代码作为溢出的参数进行传入: shellcode的C程序 注意:execve函数将执行一个程序。他需要程序的名字地址作为第一个参数。一个内容为该程序的 argv(argv[n-1]=0)的指针数组作为第二个参数,以及(char*) 0作为第三个参数。 我们来看以看execve的汇编代码: 0x804ce7c __execve: push %ebp 保存以前的数据段地址 0x804ce7d __execve+1: mov %esp,%ebp 使得当前数据段指向堆栈 0x804ce7f __execve+3: push %edi 0x804ce80 __execve+4: push %ebx 保存 0x804ce81 __execve+5: mov 0x8(%ebp),%edi ebp+8是第一个参数/bin/sh\0 0x804ce84 __execve+8: mov $0x0,%eax 清0 0x804ce89 __execve+13: test %eax,%eax 0x804ce8b __execve+15: je 0x804ce92 __execve+22 0x804ce8d __execve+17: call 0x0 0x804ce92 __execve+22: mov 0xc(%ebp),%ecx 设置NAME[0]参数,4字节对齐 0x804ce95 __execve+25: mov 0x10(%ebp),%edx,设置NAME[1]参数,4字节对齐 0x804ce98 __execve+28: push %ebx 0x804ce9

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档