- 1、本文档共25页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
缓冲区溢出-Read.ppt
缓冲区溢出
曲晶莹
基本问题
缓冲区溢出:向一个有限空间的缓冲区拷贝了过长的字符串,覆盖相邻的存储单元,会引起程序运行异常。
历史上最著名的例子是:1988 年,因特网蠕虫Morris Worm利用UNIX系统中finger程序的缓冲区溢出漏洞,获得访问权限,得到了一个shell,感染了因特网中的数万台机器,给用户带来了很大危害。
有关缓冲区溢出的数据
1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。
1998年CERT的13份建议中,有9份是与缓冲区溢出有关的;1999年,至少有半数的建议是和缓冲区溢出有关的。
在Bugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。
为什么会缓冲区溢出
在C语言中,指针和数组越界不保护是Buffer overflow的根源。
在C语言标准库中就有许多能提供溢出的函数,如strcat(), strcpy(), sprintf(), gets()和scanf()。
通过指针填充数据
不好的编程习惯
缓冲区溢出的分类
基于栈
基于堆
基于格式化字符串
Next
缓冲区溢出的原理
典型的寄存器
EIP:扩展指令指针,用于存放下一条指令的地址。
EBP:扩展基指针,用于指向基本基栈的信息。
ESP:扩展堆栈指针。指向堆栈的当前位置,允许push和pop操作等对堆栈中内容添加和删除。
典型的堆栈帧结构
函数调用时所建立的栈帧包含了下面的信息:
?????i)???为被调用函数的参数分配的空间
ii)??函数的返回地址.?
iii)?调用函数的栈帧信息,?即栈顶和栈底. ?????
iv)??为函数的局部变量分配的空间
典型的堆栈帧结构
展示堆栈的示例 example1
void?function(int?a,?int?b,?int?c)?{??? char?buffer1[5];??? char?buffer2[10];}void?main()?{?? function(1,2,3);}
展示堆栈的示例 example1
(gdb) disass main
0main+28: push $0x3
0x0804835a main+30: push $0x2
0x0804835c main+32: push $0x1
0x0804835e main+34: call 0x8048334 function
0main+39: add $0xc,%esp
(gdb) disass function
0function+0: push %ebp
0function+1: mov %esp,%ebp
0function+3: sub $0x28,%esp
展示堆栈的示例 example1
(gdb) i reg
ebp 0xbffd0f5c
esp 0xbffd0f34
(gdb) print /x buffer1
0xbffd0f44
(gdb) print /x buffer2
0xbffd0f34
3
2
1
RET 0主函数的基栈帧
buffer1
buffer2
没有受到控制的堆栈溢出Example2
int bof() {
char buffer[4];
strcpy(buffer, “AAAAAAAAAAAA”);
}
int main(int argc, char **argv) {
bof();
printf(“Not gonna do it!\n”);
return 1;
}
Segmentation fault
利用缓冲区溢出漏洞的攻击
随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation fault),而不能达到攻击的目的。
如果覆盖缓冲区的是一段精心设计的机器指令序列,它可能通过溢出,改变返回地址,将其指向自己的指令序列,从而改变该程序的正常流程。
可利用的堆栈溢出example3
void fun () {
printf (test,being hacked!!!\n);
}
int main (int argc, char **argv) {
char buf[10];
strcpy (buf, argv[1]);
文档评论(0)