逆向与BOF基础——注入shellcode并执行
准备阶段
下载安装execstack.
本次实验实验的shellcode是心远的文章中生成的代码,即
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\
为减少实验难度,设置堆栈可执行,并关闭地址随机化。
实验过程
1.构造注入的payload,格式为nop(即\x90)+shellcode+返回地址。
2.gdb调试该段代码,判断返回地址应在哪里。
3.跳坑,进去体验一下。
4.重新开始时,使用了另一种构造注入payload的方法,anything+retaddr+nops+shellcode,只要返回地址在该范围内,最终都会滑行到shellcode上。
5.成功。
Return-to-libc
准备工作
- 执行安装可用于编译32位程序的东西的命令。
sudo apt-get update
sudo apt-get install lib32z1 libc6-dev-i386
sudo apt-get install lib32readline-gplv2-dev
- 进入32位Linux环境,使用bash。
攻击漏洞程序并获得root权限
关闭堆和栈初始地址的随机化。
用zsh代替/bin/bash
编写漏洞程序,保存在/tmp目录下
编译该程序,使用“栈不可执行”,设置SET-UID
编写读取环境变量的程序并编译
编写攻击程序,将其放在/tmp下
使用获取环境变量的程序取得BIN_SH 的地址
使用GDB获取system和exit的地址
修改攻击程序,将取得的地址填入相应的位置,重新编译。
运行攻击程序和漏洞程序,获得root权限。
将/bin/sh 重新指向/bin/bash(或/bin/dash)
指向/bin/bash
指向/bin/dash
与缓冲区溢出漏洞实验的异同
- 相同之处:利用漏洞来获得对被攻击者的权限,都需关闭地址随机化。
- 不同之处:缓冲区溢出需用shellcode的地址来覆盖程序的返回地址,使漏洞程序去执行栈中的shellcode;而return-to-libc是漏洞程序调转已编好的代码实现攻击。