而 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程序:
gcc -m32 -o exploit exploit.c
先运行攻击程序exploit,再运行漏洞程序stack,观察结果:

可见,通过攻击,获得了root权限!
2.练习二
(实验二未成功截图,由于错误操作,无法从练习三返回练习二的实验结果)
3.练习三

四、实验总结
1.(遇到的问题)实验时出现sudo:无法解析主机,但后来百度查询后,发现这个是因为主机名称的问题,并不影响实验,就没有对其进行修改。另外,由于网速的问题,有些命令行可能会重复或者出错,尤其在需要输入密码的程序段之后。
2.许多shell程序在被调用时自动放弃它们的特权。因此,即使你能欺骗一个Set-UID程序调用一个shell,也不能在这个shell中保持root权限。
3.操作系统所使用的缓冲区 是"堆栈".,在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出 。缓冲区溢出通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。
4.在练习二中,由于地址空间随机化被开启,导致之前计算的地址与实际的地址出现了不同,从而不能完成攻击。而练习三中,使用的bash程序,当shell运行时,没有root权限,此时,即便攻击程序攻击了漏洞程序,也无法完成攻击。
5.通过本次实验,我了解了一些关于缓冲区溢出的保护机制以及缓冲区安全的重要性,明白了堆栈地址与权限的作用,堆栈初始地址的随机化和放弃root权限对于防止黑客利用缓存区溢出进行攻击有非常重要的作用。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-35223-3.html
你存万八千的