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