站长网_站长创业_站长主页_站长之家_易采站长站

会员投稿 投稿指南 站长资讯通告: 缓冲区溢出分析
搜索:
您的位置: 主页 > 教程 > 电脑安全 > 侵入攻防 > » 正文

缓冲区溢出分析

来源: 易采站长站
1. 简介

我在 http://www.hack.co.za/ 上看到 Lam3rZ 小组的 Kil3r 写的一个针对
redhat 6.1 (and others) /usr/bin/man exploit,下载回来后,直接编译运行,并
没有完成攻击。注意到原exploit是针对不可执行堆栈环境编写的,而我测试的主机
没有打不可执行堆栈补丁等等。其实针对不可执行堆栈环境的缓冲区溢出技术同样可
以用于"常规"环境,所以就此次攻击做一完整描述,抛砖引玉,见笑。

2. 问题描述

/usr/bin/man 会使用 MANPAGER 环境变量,关于这个变量的细节请 man man 查看。
当 MANPAGER 变量设置成超长字符串时,会导致 /usr/bin/man 执行中缓冲区溢出。

[scz@ /home/scz/src]> export MANPAGER=`perl -e 'print "A"x1'`
[scz@ /home/scz/src]> man ls
sh: A: command not found
Error executing formatting or display command.
System command (cd /usr/man ; (echo -e ".ll 9.9i\n.pl 1100i";
/bin/cat /usr/man/man1/ls.1; echo ".pl \n(nlu 10") | /usr/bin/gtbl |
/usr/bin/groff -Tlatin1 -mandoc | A) exited with status 127.
No manual entry for ls ^
[scz@ /home/scz/src]> |
|
------<------ 注意这里就是 MANPAGER 变量

注意到命令最后通过管道符'|'传递给了 MANPAGER 变量所指定的程序。

我们重复类似的操作,不断加大 MANPAGER 变量的长度,直到发生溢出。用"二分法"
较快地确定出当长度最小为 3945 时,缓冲区溢出并导致段错误。

[scz@ /home/scz/src]> export MANPAGER=`perl -e 'print "A"x3945'`
[scz@ /home/scz/src]> man ls
sh: A...A: command not found
Error executing formatting or display command.
System command (cd /usr/man ; (echo -e ".ll 9.9i\n.pl 1100i";
/bin/cat /usr/man/man1/ls.1; echo ".pl \n(nlu 10") | /usr/bin/gtbl |
/usr/bin/groff -Tlatin1 -mandoc | A...A) exited with status 127.
Segmentation fault <-- -- -- 这里已经出现段错误,通常是指针操作访问非法地
[scz@ /home/scz/src]> 址造成,很可能某个函数的返回地址已经被覆盖掉
[scz@ /home/scz/src]> unset MANPAGER <-- -- -- 这里删除该环境变量恢复正常

3. 攻击思路

姑且假设 /usr/bin/man 执行过程中读取 MANPAGER 变量到一个缓冲区中,由于未做
边界检查导致溢出,并覆盖了某个函数的返回地址。显然,覆盖值来自 MANPAGER 变
量的值,换句话说,用于覆盖的返回地址来自 MANPAGER 变量的值。

在"常规"环境下,理论上可以直接通过 MANPAGER 变量传递用于覆盖的返回地址以及
shellcode本身,因为3945大小的缓冲区已经足以做任何事情,也可以仅仅通过
Tags:
最新图文资讯
1 2 3 4 5 6
相关文章列表:
易采站长站 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助 -