标签:
一.实验描述
缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况,这一漏洞可以被
恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现时由于缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
二.实验准备
练习1:
3.1初始设置
3.2 shellcode
一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是shellcode。
观察以下代码:
#include <stdio.h>
int main( ) {
char *name[2];
name[0] = ‘‘/bin/sh’’;
name[1] = NULL;
execve(name[0], name, NULL);
}
本次实验的shellcode,就是刚才代码的汇编版本:
\x31\xc0\x50\x68"//sh"\x68"/bin"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80
3.3漏洞程序
GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector 关闭这种机制。而 -z execstack 用于允许执行栈。
注意在tmp目录下。
3.4 攻击程序
需要调用gdb跟踪。
建立exploit.c文件
得出其地址如下:
3.5 攻击结果
通过了攻击,获得了root权限
练习2:
通过命令”sudo sysctl -w kernel.randomize_va_space=2“打开系统的地址空间随机化机制,重复用exploit程序攻击stack程序,观察能否攻击成功,能否获得root权限
未获得root权限
练习3
将/bin/sh重新指向/bin/bash(或/bin/dash),观察能否攻击成功,能否获得root权限。
未获得root权限
二.实验体会
在本实验中,Ubuntu和其他一些Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此,即使你能欺骗一个Set-UID程序调用一个shell,也不能在这个shell中保持root权限,这个防护措施在/bin/bash中实现。收获良多,还望继续努力!
标签:
原文地址:http://www.cnblogs.com/yuyuyuyu/p/4452178.html