通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 网络编程 >> 文章正文
溢出的基础,溢出的原理技术大全
责任编辑:酷酷の鱼   更新日期:2007-11-17
 

自己写溢出的基础,溢出原理
一:基础知识
计算机内存运行分配的区域分为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[i](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
0x804ce99 <__execve+29>: mov %edi,%ebx
0x804ce9b <__execve+31>: mov $0xb,%eax ‘设置XB号调用
0x804cea0 <__execve+36>: int $0x80 ‘调用执行
0x804cea2 <__execve+38>: pop %ebx
0x804cea3 <__execve+39>: mov %eax,%ebx
0x804cea5 <__execve+41>: cmp $0xfffff000,%ebx
0x804ceab <__execve+47>: jbe 0x804cebb <__execve+63>
0x804cead <__execve+49>: call 0x8048324 <__errno_location>
0x804ceb2 <__execve+54>: neg %ebx
0x804ceb4 <__execve+56>: mov %ebx,(%eax)
0x804ceb6 <__execve+58>: mov $0xffffffff,%ebx
0x804cebb <__execve+63>: mov %ebx,%eax
0x804cebd <__execve+65>: lea 0xfffffff8(%ebp),%esp
0x804cec0 <__execve+68>: pop %ebx
0x804cec1 <__execve+69>: pop %edi
0x804cec2 <__execve+70>: leave
0x804cec3 <__execve+71>: ret 精练的调用方法是
0x804ce92 <__execve+22>: mov 0xc(%ebp),%ecx ‘设置NAME[0]参数,4字节对齐
0x804ce95 <__execve+25>: mov 0x10(%ebp),%edx,设置NAME[1]参数,4字节对齐
0x804ce9b <__execve+31>: mov $0xb,%eax ‘设置XB号调用
0x804cea0 <__execve+36>: int $0x80 ‘调用执行 另外要执行一个exit()系统调用,结束shellcode的执行。
0x804ce60 <_exit>: mov %ebx,%edx
0x804ce62 <_exit+2>: mov 0x4(%esp,1),%ebx 设置参数0
0x804ce66 <_exit+6>: mov $0x1,%eax ‘1号调用
0x804ce6b <_exit+11>: int $0x80
0x804ce6d <_exit+13>: mov %edx,%ebx
0x804ce6f <_exit+15>: cmp $0xfffff001,%eax
0x804ce74 <_exit+20>: jae 0x804d260 <__syscall_error> 那么总结一下,合成的汇编代码为:
mov 0xc(%ebp),%ecx
mov 0x10(%ebp),%edx
mov $0xb,%eax
int $0x80
mov 0x4(%esp,1),%ebx
mov $0x1,%eax 
int $0x80 但问题在于我们必须把这个程序作为字符串的参数传给溢出的程序进行调用,如何来分配和定位字符串“ /bin/sh”,还得有一个name数组。我们可以构造它们出来,可是,在shellcode中如何知道它们的地址呢 ?每一次程序都是动态加载,字符串和name数组的地址都不是固定的

[1] [2] 下一页

  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    固顶文章 爱国者安全网2007年度优秀版主评选
    普通文章 瑞星公司01月11日发布 每日计算机病毒及木马播报
    普通文章 破解博彩神助(专注彩票) V2.8.01
    推荐文章 推荐:跨站脚本执行漏洞代码的六点思路
    普通文章 Windows系统下的远程堆栈溢出 实战篇
    普通文章 Windows系统下的远程堆栈溢出 原理篇
    普通文章 MsSQLServer是如何加密口令的
    普通文章 浅谈国内的渗透评估过程
    普通文章 Dvbbs8.1 0DAY(通杀Access和mssql版本)
    普通文章 微软:我们的代码比赛门铁克更安全
    热门文章
    普通文章REAL蛀虫利用播放器漏洞下载恶意程序
    普通文章李彦宏:中国要在互联网领域逐渐超越美国
    普通文章马云:阿里巴巴的成功是一个生态链的成功
    普通文章Ingres用户认证非授权访问漏洞
    普通文章TCPreen FD_SET()函数远程栈溢出漏洞
    普通文章Winace UUE文件解压堆溢出漏洞
    普通文章Pclxav木马猎手第一代特征码引擎源代码
    普通文章IE收藏夹管理小精灵算法分析
    普通文章Extra Drive Pro算法分析历程
    普通文章雨过天晴自我注册
    精彩专题