战胜不可执行栈:利用技术与返回libc方法

需积分: 50 85 下载量 76 浏览量 更新于2024-08-11 收藏 2.99MB PDF 举报
"战胜不可执行栈-is903技术手册" 本文档主要讨论了如何在面对不可执行栈(Execute Disable,XD)这样的安全机制时,依然能够进行漏洞利用,特别是针对栈溢出漏洞的利用策略。不可执行栈是操作系统用来防止Shellcode在栈上直接执行的一种防御措施,常见于Solaris、OpenBSD以及某些版本的Windows。 在《The Shellcoder's Handbook》一书中,作者详细介绍了栈溢出的基本原理和利用方法。在栈溢出中,攻击者通常通过填充缓冲区来覆盖返回地址,使得程序跳转到攻击者提供的代码(Shellcode)执行。然而,当栈不可执行时,这种方法不再有效,因为操作系统会阻止栈上的代码被执行。 为了应对这种情况,作者提出了“返回libc(Return to libc)”的方法。在这种方法中,攻击者不直接在栈上放置Shellcode,而是寻找已加载的libc库中的特定函数或系统调用地址,通过控制EIP(指令指针寄存器)使其指向这些地址。这样,即使栈上的代码不能执行,程序也能被引导执行攻击者期望的操作,如调用`system()`函数执行命令或者调用`execve()`函数执行任意程序。 书中的示例展示了如何通过调整溢出的长度,找到合适的偏移量,以确保返回地址能够指向libc中的关键函数。这包括了使用NOP(No Operation)指令作为填充,以增加成功利用的机会。NOP指令在溢出后形成一个NOP滑梯,即使返回地址略有偏差,程序也能正确跳转到目标地址。 此外,书中还涵盖了其他相关主题,如Shellcode的编写、系统调用的理解、格式化字符串漏洞的利用以及Windows环境下的堆溢出等。这些内容对于深入理解漏洞利用和提高安全防护意识至关重要。 总结来说,面对不可执行栈的挑战,攻击者可以采取返回libc的策略,利用程序库中的已知函数或系统调用来实现攻击目的。而防御者则需要不断更新和强化安全机制,如采用数据执行防止(DEP)等技术,以防止这类攻击。对于开发者而言,理解这些攻击手段有助于编写更安全的代码,减少漏洞的出现。