Stack Shellcode
基本信息
栈 Shellcode 是一种在二进制利用中使用的技术,攻击者将 shellcode 写入一个易受攻击程序的栈中,然后修改指令指针(IP)或扩展指令指针(EIP),使其指向该 shellcode 的位置,从而执行该 shellcode。这是一种经典方法,用于未经授权访问或在目标系统上执行任意命令。以下是该过程的详细说明,包括一个简单的 C 示例以及如何使用 Python 和 pwntools 编写相应的利用程序。
C 示例:一个易受攻击的程序
让我们从一个易受攻击的 C 程序的简单示例开始:
这个程序由于使用了gets()
函数而容易受到缓冲区溢出的影响。
编译
要编译这个程序并禁用各种保护措施(以模拟一个有漏洞的环境),您可以使用以下命令:
-fno-stack-protector
: 禁用堆栈保护。-z execstack
: 使堆栈可执行,这对于在堆栈上执行存储的 shellcode 是必要的。-no-pie
: 禁用位置无关可执行文件,使得更容易预测 shellcode 将位于的内存地址。-m32
: 将程序编译为 32 位可执行文件,通常用于简化利用开发。
使用 Pwntools 编写的 Python 攻击
以下是如何使用 pwntools 在 Python 中编写攻击以执行 ret2shellcode 攻击:
这个脚本构建了一个由NOP滑动、shellcode组成的有效载荷,然后用指向NOP滑动的地址覆盖EIP,确保shellcode被执行。
NOP滑动(asm('nop')
)用于增加执行进入我们的shellcode的机会,无论确切地址如何。调整p32()
参数为缓冲区起始地址加上一个偏移量,以落入NOP滑动中。
保护措施
ASLR 应该被禁用,以确保地址在不同执行中可靠,否则函数存储的地址不会始终相同,你需要一些泄漏来找出win函数加载的位置。
栈保护也应该被禁用,否则受损的EIP返回地址将不会被跟随。
NX 栈保护会阻止在栈内执行shellcode,因为该区域不可执行。
其他示例和参考资料
64位,带有栈地址泄漏的ASLR,编写shellcode并跳转至其
32位,带有栈泄漏的ASLR,编写shellcode并跳转至其
32位,带有栈泄漏的ASLR,比较以防止调用exit(),用值覆盖变量并编写shellcode并跳转至其
arm64,无ASLR,ROP gadget使栈可执行并跳转至栈中的shellcode
最后更新于