而 -z execstack 用于允许执行栈。

我们的目的是攻击刚才的漏洞程序,并通过攻击获得root权限。
把以下代码保存为“exploit.c”文件,保存到 /tmp 目录下。代码如下:

注意上面的代码,“\x??\x??\x??\x??”处需要添上shellcode保存在内存中的地址,因为发生溢出后这个位置刚好可以覆盖返回地址。
而 strcpy(buffer+100,shellcode); 这一句又告诉我们,shellcode保存在 buffer+100 的位置。
现在我们要得到shellcode在内存中的地址,输入命令:
gdb stack
disass main
结果如图:

接下来的操作:


根据语句 strcpy(buffer+100,shellcode); 我们计算shellcode的地址为 0xffffd1b0(十六进制)+100(十进制)=0xffffd214(十六进制)
现在修改exploit.c文件!将 \x??\x??\x??\x?? 修改为 \x14\xd2\xff\xff

然后,编译exploit.c程序:
先运行攻击程序exploit,再运行漏洞程序stack,观察结果:

可见,通过攻击,获得了root权限!
答:攻击不成功,不能获得root权限
答:当关闭内存随机化机制时,可以攻击成功,获得root权限;当没有关闭内存随机化机制时,攻击不成功,不能获得root权限

1、一开始因为屏幕不出现字符,不知道要输入密钥shiyanlou;
2、进入gdb追踪后不知道如何退出,后来从同学那儿知道是qiut;
缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况,是一种非常普遍、非常危险的漏洞,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。缓冲区溢出攻击,可以导致程序运行失败、系统关机、重新启动,或者执行攻击者的指令,比如非法提升权限。
在本实验中,Ubuntu和其他一些Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中,我们使用以下命令关闭这一功能:sudo sysctl -w kernel.randomize_va_space=0
为了进一步防范缓冲区溢出攻击及其它利用shell程序的攻击,许多shell程序在被调用时自动放弃它们的特权。因此,即使你能欺骗一个Set-UID程序调用一个shell,也不能在这个shell中保持root权限,这个防护措施在/bin/bash中实现。
缓冲区溢出漏洞实验
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-28103-2.html
>吹的还是真的