电商网站有哪些使用场景,哪个厂家的广州网站建设,济南建网站公司报价,wordpress 清理图片Return-to-libc 攻击实验 缓冲区溢出的常用攻击方法是用 shellcode 的地址来覆盖漏洞程序的返回地址#xff0c;使得漏洞程序去执行存放在栈中 shellcode。为了阻止这种类型的攻击#xff0c;一些操作系统使得系统管理员具有使栈不可执行的能力。这样的话#xff0c;一旦程序… Return-to-libc 攻击实验 缓冲区溢出的常用攻击方法是用 shellcode 的地址来覆盖漏洞程序的返回地址使得漏洞程序去执行存放在栈中 shellcode。为了阻止这种类型的攻击一些操作系统使得系统管理员具有使栈不可执行的能力。这样的话一旦程序执行存放在栈中的 shellcode 就会崩溃从而阻止了攻击。 不幸的是上面的保护方式并不是完全有效的现在存在一种缓冲区溢出的变体攻击叫做 return-to-libc 攻击。这种攻击不需要一个栈可以执行甚至不需要一个 shellcode。取而代之的是我们让漏洞程序调转到现存的代码比如已经载入内存的 libc 库中的 system函数等来实现我们的攻击。 实验准备 输入命令安装一些用于编译 32 位 C 程序的东西 sudo apt-get update
sudo apt-get install lib32z1 libc6-dev-i386
sudo apt-get install lib32readline-gplv2-dev 输入命令“linux32”进入 32 位 linux 环境。输入“/bin/bash”使用 bash 实验步骤 初始设置 Ubuntu 和其他一些 Linux 系统中使用地址空间随机化来随机堆heap和栈stack的初始地址这使得猜测准确的内存地址变得十分困难而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中我们使用以下命令关闭这一功能 sudo sysctl -w kernel.randomize_va_space0 此外为了进一步防范缓冲区溢出攻击及其它利用 shell 程序的攻击许多 shell 程序在被调用时自动放弃它们的特权。因此即使你能欺骗一个 Set-UID 程序调用一个 shell也不能在这个 shell 中保持 root 权限这个防护措施在/bin/bash 中实现。 linux 系统中/bin/sh 实际是指向/bin/bash 或/bin/dash 的一个符号链接。为了重现这一防护措施被实现之前的情形我们使用另一个 shell 程序zsh代替/bin/bash。下面的指令描述了如何设置 zsh 程序 sudo su
cd /bin
rm sh
ln -s zsh sh
exit 为了防止缓冲区溢出攻击最近版本的 gcc 编译器默认将程序编译设置为栈不可执行而你可以在编译的时候手动设置是否使栈不可执行 gcc -z execstack -o test test.c #栈可执行
gcc -z noexecstack -o test test.c #栈不可执行 本次实验的目的就是展示这个“栈不可执行”的保护措施并不是完全有效所以我们使用“-z noexecstack”或者不手动指定而使用编译器的默认设置。 漏洞程序 把以下代码保存为“retlib.c”文件保存到 /tmp 目录下。代码如下 这个程序有缓冲区溢出漏洞我们的任务是利用这个漏洞。 上述程序有一个缓冲区溢出漏洞它先从一个叫“badfile”的文件里把 40 字节的数据读取到 12 字节的 buffer引起溢出。fread()函数不检查边界所以会发生溢出。应该注意到此程序是从一个叫做“badfile”的文件获得输入的这个文件受用户控制。现在我们的目标是为“badfile”创建内容这样当这段漏洞程序将此内容复制进它的缓冲区便产生了一个 root shell 。 编译该程序并设置 SET-UID。命令如下 sudo sugcc -m32 -g -z noexecstack -fno-stack-protector -o retlib retlib.cchmod us retlibexit -z noexecstack是栈不可执行。GCC 编译器有一种栈保护机制来阻止缓冲区溢出所以我们在编译代码时需要用 –fno-stack-protector 关闭这种机制。“为了方便普通用户执行一些特权命令SUID/SGID程序允许普通用户以root身份暂时执行该程序并在执行结束后再恢复身份。”chmod us 就是给某个程序的所有者以suid权限可以像root用户一样操作。 我们还需要用到一个读取环境变量的程序 攻击程序 把以下代码保存为“exploit.c”文件保存到 /tmp 目录下。代码如下 获取内存地址 gdb 获得 system 和 exit 地址 修改 exploit.c 文件填上刚才找到的内存地址 删除刚才调试编译的 exploit 程序和 badfile 文件重新编译修改后的 exploit.c rm exploit
rm badfile
gcc -m32 -o exploit exploit.c 攻击 先运行攻击程序 exploit再运行漏洞程序 retlib可见攻击成功获得了 root 权限 至此实验结束。 转载于:https://www.cnblogs.com/crisgy/p/6160302.html