最后更新于
最后更新于
在开始利用任何东西之前,了解ELF二进制文件的结构的一部分是很有趣的:
有这么多技术,最好有一个方案,确定何时使用每种技术是有用的。请注意,相同的保护措施将影响不同的技术。您可以在每个保护部分找到绕过保护的方法,但在此方法论中没有提到。
有不同的方法可以控制程序的流程:
覆盖栈上的返回指针或 EBP -> ESP -> EIP。
可能需要滥用 来引发溢出
或通过任意写入 + 写入何处执行来实现
**:**滥用 printf
在任意地址写入任意内容。
:滥用设计不良的索引以控制某些数组并进行任意写入。
可能需要滥用 来引发溢出
bof to WWW via ROP:滥用缓冲区溢出构建ROP,从而能够获得WWW。
您可以在以下位置找到写入何处执行技术:
需要考虑的一点是通常仅利用漏洞一次可能不足以执行成功的利用,特别是需要绕过一些保护措施。因此,有趣的是讨论一些选项,使单个漏洞在二进制文件的同一执行中可利用多次:
在ROP链中写入**main
函数的地址**或漏洞发生的地址。
通过控制正确的ROP链,您可能能够执行该链中的所有操作
在GOT中写入exit
地址(或二进制文件在结束前使用的任何其他函数)以返回到漏洞处
如果需要设置多个参数以正确调用ret2win函数,则可以使用:
这将混合shellcode与ROP链。
找到使用的**libc
版本**(泄漏几个函数地址)
检查具有ASLR的先前情况以继续。
对于off-by-one堆栈溢出很有用。
作为控制EIP的替代方式,滥用EIP在内存中构造有效负载,然后通过EBP跳转到它。
如中所述,将2个函数存储在这里,一个用于再次调用漏洞,另一个用于调用**__libc_csu_fini
**,后者将再次调用.fini_array
中的函数。
:代码中有一个需要调用的函数(可能带有一些特定参数)以获取标志。
在没有和的常规bof中,只需在栈中存储的返回地址中写入地址。
在带有的bof中,您将需要绕过它
在带有的bof中,您将需要绕过它
如果有足够的gadgets,可以使用链来准备所有参数
(如果可以调用此系统调用)来控制许多寄存器
来自和的gadgets来控制多个寄存器
通过,您可以滥用其他漏洞(非bof)来调用**win
**函数。
:如果栈包含将要调用的函数的指针,或者包含将要被有趣函数(system或printf)使用的字符串的指针,可以覆盖该地址。
或 可能会影响地址。
:您永远不知道。
:这对于在覆盖返回指针之前或之后在栈中存储shellcode,然后跳转到它执行它非常有用:
在任何情况下,如果有 **,在常规bof中您将需要绕过(泄漏)它
没有 和 ,可以跳转到栈的地址,因为它永远不会改变
有 ,您将需要使用诸如之类的技术来跳转到它
有 ,您将需要使用一些 调用memprotect
,使某些页面rwx
,然后在那里存储shellcode(例如调用read),然后跳转到那里。
: 用于调用execve
以运行任意命令。您需要能够找到调用特定syscall的gadgets及其参数。
如果启用了或,您需要打败它们,以便使用二进制文件或库中的ROP gadgets。
可用于准备ret2execve。
来自和的gadgets可用于控制多个寄存器。
: 用于调用库中的函数(通常是**libc
)如system
并带有一些准备好的参数(例如'/bin/sh'
)。您需要二进制文件加载包含要调用的函数的库**(通常是libc)。
如果静态编译且没有,system
和/bin/sh
的地址不会改变,因此可以静态使用它们。
没有 且知道加载的libc版本,system
和/bin/sh
的地址不会改变,因此可以静态使用它们。
具有 但没有,知道libc并且二进制文件使用system
函数时,可以ret
到GOT中system的地址并带有'/bin/sh'
的地址(您需要弄清楚这一点)。
具有但没有,知道libc但二进制文件不使用system
:
使用解析system
的地址并调用它。
绕过并计算内存中system
和'/bin/sh'
的地址。
具有 和 但不知道libc:您需要:
绕过
: 控制ESP以通过堆栈中存储的EBP控制RET。
: 如果堆栈包含将要被调用的函数或将要被有趣函数(如system或printf)使用的字符串的指针,可以覆盖该地址。
或可能会影响地址。
: 永远不知道
如果您想看到您的公司在HackTricks中做广告或下载PDF格式的HackTricks,请查看!
获取
探索,我们的独家收藏品
加入 💬 或 或在Twitter 🐦 上关注我们。
通过向和 github仓库提交PR来分享您的黑客技巧。