1.1 Linux栈溢出保护机制基本的栈溢出攻击,是最早产生的一种缓冲区溢出攻击方法,它是所有其他缓冲区溢出攻击的基础。但是,由于这种攻击方法产生的时间比较长,故而GCC编译器、Linux操作系统提供了一些机制来阻止这种攻击方法对系统产生危害。下面首先了解一下现有的用于保护堆栈的机制以及关闭相应保护机制的方法,为进一步分析基本栈溢出提供了良好的实验环境。1. 内存地址随机化机制在Ubuntu和其他基于Linux内核的系统中,目前都采用内存地址随机化的机制来初始化堆栈,这将会使得猜测具体的内存地址变得十分困难。关闭内存地址随机化机制的方法是:sysctl –w kernel.randomize_va_space=02. 可执行程序的屏蔽保护机制对于Federal系统,默认会执行可执行程序的屏蔽保护机制,该机制不允许执行存储在栈中的代码,这会使得缓冲区溢出攻击变得无效。而Ubuntu系统中默认没有采用这种机制。关闭可执行程序的屏蔽保护机制的方法是:sysctl –w kernel.exec-shield=03. gcc编译器gs验证码机制gcc编译器专门为防止缓冲区溢出而采取的保护措施,具体方法是gcc首先在缓冲区被写入之前在buf的结束地址之后返回地址之前放入随机的gs验证码,并在缓冲区写入操作结束时检验该值。通常缓冲区溢出会从低地址到高地址覆写内存,所以如果要覆写返回地址,则需要覆写该gs验证码。这样就可以通过比较写入前和写入后gs验证码的数据,判断是否产生溢出。关闭gcc编译器gs验证码机制的方法是:在gcc编译时采用-fno-stack-protector选项。4. ld链接器堆栈段不可执行机制ld链接器在链接程序的时候,如果所有的.o文件的堆栈段都标记为不可执行,那么整个库的堆栈段才会被标记为不可执行;相反,即使只有一个.0文件的堆栈段被标记为可执行,那么整个库的堆栈段将被标记为可执行。检查堆栈段可执行性的方法是:如果是检查ELF库:readelf -lW $BIN | grep GNU_STACK查看是否有E标记如果是检查生成的.o文件:scanelf -e $BIN查看是否有X标记ld链接器如果将堆栈段标记为不可执行,即使控制了eip产生了跳转,依然会产生段错误。关闭ld链接器不可执行机制的方法是:在gcc编译时采用-z execstack选项。1.1 基本栈溢出攻击原理及实验下面,将用一个栈溢出攻击的例子的方式,来详细的讲解基本的栈溢出攻击的详细方法步骤。在进行试验之前,先利用上面讲解的方法,将相应的栈保护机制关闭掉。
- root@linux:~/pentest# sysctl -w kernel.randomize_va_space=0
- kernel.randomize_va_space = 0
- root@linux:~/pentest# sysctl -w kernel.exec-shield=0
- error: "kernel.exec-shield" is an unknown key
|
代码如下:
- root@linux:~/pentest# cat vulnerable.c
- #include <stdio.h>
- #include <string.h>
-
- int main(int argc, char **argv) {
-
- char buffer[500];
- strcpy(buffer, argv[1]);
-
- return 0;
- }
|
编译源码:
| root@linux:~/pentest# gcc -fno-stack-protector -z execstack -g -o vulnerable vulnerable.c |
用gdb调试该程序:
- root@linux:~/pentest# gdb vulnerable
- GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
- Copyright (C) 2010 Free Software Foundation, Inc.
- License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
- This is free software: you are free to change and redistribute it.
- There is NO WARRANTY, to the extent permitted by law. Type "show copying"
- and "show warranty" for details.
- This GDB was configured as "i686-linux-gnu".
- For bug reporting instructions, please see:
- <http://www.gnu.org/software/gdb/bugs/>...
- Reading symbols from /root/pentest/vulnerable...done.
- (gdb) disass main
- Dump of assembler code for function main:
- 0x080483c4 <+0>: push %ebp
- 0x080483c5 <+1>: mov %esp,%ebp
- 0x080483c7 <+3>: and {1}xfffffff0,%esp
- 0x080483ca <+6>: sub {1}x210,%esp
- 0x080483d0 <+12>: mov 0xc(%ebp),%eax
- 0x080483d3 <+15>: add {1}x4,%eax
- 0x080483d6 <+18>: mov (%eax),%eax
- 0x080483d8 <+20>: mov %eax,0x4(%esp)
- 0x080483dc <+24>: lea 0x1c(%esp),%eax
- 0x080483e0 <+28>: mov %eax,(%esp)
- 0x080483e3 <+31>: call 0x80482f4 <strcpy@plt>
- 0x080483e8 <+36>: mov {1}x0,%eax
- 0x080483ed <+41>: leave
- 0x080483ee <+42>: ret
- End of assembler dump.
- (gdb)
|
Symantec IM Manager远程SQL注入漏洞ret2reg缓冲区溢出攻击相关资讯 Linux安全
- 发现针对 Linux 服务器和代码库的 (11/08/2015 09:11:50)
- Linux安全与优化 (12/05/2014 17:04:31)
- 加强 Linux 桌面安全 (08/15/2014 11:36:10)
| - 牢记这七点 让你的Linux服务器变得 (08/12/2015 15:39:07)
- 树大招风,Linux的安全威胁正在不 (08/24/2014 21:44:47)
- GNU/Linux安全基线与加固 (07/22/2014 13:51:21)
|
本文评论 查看全部评论 (0)
评论声明- 尊重网上道德,遵守中华人民共和国的各项有关法律法规
- 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
- 本站管理人员有权保留或删除其管辖留言中的任意内容
- 本站有权在网站内转载或引用您的评论
- 参与本评论即表明您已经阅读并接受上述条款
|