Return-to-libc攻击实验
一、实验描述
缓冲区溢出的常用攻击方法是用 shellcode 的地址来覆盖漏洞程序的返回地址,使得漏洞程序去执行存放在栈中 shellcode。为了阻止这种类型的攻击,一些操作系统使得系统管理员具有使栈不可执行的能力。这样的话,一旦程序执行存放在栈中的 shellcode 就会崩溃,从而阻止了攻击。
不幸的是上面的保护方式并不是完全有效的,现在存在一种缓冲区溢出的变体攻击,叫做 return-to-libc 攻击。这种攻击不需要一个栈可以执行,甚至不需要一个 shellcode。取而代之的是我们让漏洞程序调转到现存的代码(比如已经载入内存的 libc 库中的 system()函数等)来实现我们的攻击。
二、实验内容
0.相关说明
本次实验在32为Linux下进行,如果操作系统为64位,需要按照如下方法设置。实验使用的shell脚本为zsh。关闭地址空间随机化。
sudo apt-get update
sudo apt-get install lib32z1 libc6-dev-i386
sudo apt-get install lib32readline-gplv2-dev
ln -s /bin/zsh /bin/sh
sudo sysctl -w kernel.randomize_va_space=0
使用gcc编译程序时,可以手动指定编译后的程序是否允许执行栈。如果不指定,默认为不可执行。
gcc -z execstack -o test test.c #栈可执行
gcc -z noexecs