hacktricks/binary-exploitation/basic-binary-exploitation-methodology/README.md

10 KiB
Raw Blame History

二进制基础渗透方法论

从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS Red Team Expert

支持HackTricks的其他方式

ELF基础信息

在开始利用任何东西之前,了解ELF二进制文件的结构的一部分是很有趣的:

{% content-ref url="elf-tricks.md" %} elf-tricks.md {% endcontent-ref %}

利用工具

{% content-ref url="tools/" %} tools {% endcontent-ref %}

栈溢出方法论

有这么多技术,最好有一个方案,确定何时使用每种技术是有用的。请注意,相同的保护措施将影响不同的技术。您可以在每个保护部分找到绕过保护的方法,但在此方法论中没有提到。

控制流程

有不同的方法可以控制程序的流程:

  • 栈溢出 覆盖栈上的返回指针或 EBP -> ESP -> EIP。
  • 可能需要滥用整数溢出 来引发溢出
  • 或通过任意写入 + 写入何处执行来实现
  • 格式化字符串****滥用 printf 在任意地址写入任意内容。
  • 数组索引:滥用设计不良的索引以控制某些数组并进行任意写入。
  • 可能需要滥用整数溢出 来引发溢出
  • bof to WWW via ROP滥用缓冲区溢出构建ROP从而能够获得WWW。

您可以在以下位置找到写入何处执行技术:

{% content-ref url="../arbitrary-write-2-exec/" %} arbitrary-write-2-exec {% endcontent-ref %}

永久循环

需要考虑的一点是通常仅利用漏洞一次可能不足以执行成功的利用,特别是需要绕过一些保护措施。因此,有趣的是讨论一些选项,使单个漏洞在二进制文件的同一执行中可利用多次

  • ROP链中写入**main函数的地址**或漏洞发生的地址。
  • 通过控制正确的ROP链您可能能够执行该链中的所有操作
  • GOT中写入exit地址(或二进制文件在结束前使用的任何其他函数)以返回到漏洞处
  • .fini_array中所述将2个函数存储在这里一个用于再次调用漏洞另一个用于调用**__libc_csu_fini**,后者将再次调用.fini_array中的函数。

利用目标

目标:调用现有函数

  • ret2win:代码中有一个需要调用的函数(可能带有一些特定参数)以获取标志。
  • 在没有PIEcanary的常规bof中只需在栈中存储的返回地址中写入地址。
  • 在带有PIE的bof中您将需要绕过它
  • 在带有canary的bof中您将需要绕过它
  • 如果需要设置多个参数以正确调用ret2win函数,则可以使用:
  • 如果有足够的gadgets可以使用ROP链来准备所有参数
  • SROP(如果可以调用此系统调用)来控制许多寄存器
  • 来自ret2csuret2vdso的gadgets来控制多个寄存器
  • 通过写入何处执行您可以滥用其他漏洞非bof来调用**win**函数。
  • 指针重定向如果栈包含将要调用的函数的指针或者包含将要被有趣函数system或printf使用的字符串的指针可以覆盖该地址。
  • ASLRPIE 可能会影响地址。
  • 未初始化变量:您永远不知道。

目标RCE

通过shellcode如果nx被禁用或将shellcode与ROP混合

  • (Stack) Shellcode这对于在覆盖返回指针之前或之后在栈中存储shellcode然后跳转到它执行它非常有用:
  • 在任何情况下,如果有 canary**在常规bof中您将需要绕过泄漏
  • 没有 ASLR nx,可以跳转到栈的地址,因为它永远不会改变
  • ASLR,您将需要使用诸如ret2esp/ret2reg之类的技术来跳转到它
  • nx,您将需要使用一些ROP 调用memprotect,使某些页面rwx,然后在那里存储shellcode例如调用read然后跳转到那里。
  • 这将混合shellcode与ROP链。

通过syscalls

  • Ret2syscall: 用于调用execve以运行任意命令。您需要能够找到调用特定syscall的gadgets及其参数
  • 如果启用了ASLRPIE,您需要打败它们,以便使用二进制文件或库中的ROP gadgets
  • SROP可用于准备ret2execve
  • 来自ret2csuret2vdso的gadgets可用于控制多个寄存器。

通过libc

  • Ret2lib: 用于调用库中的函数(通常是**libc)如system并带有一些准备好的参数(例如'/bin/sh')。您需要二进制文件加载包含要调用的函数的库**通常是libc
  • 如果静态编译且没有PIEsystem/bin/sh地址不会改变,因此可以静态使用它们。
  • 没有ASLR 且知道加载的libc版本system/bin/sh地址不会改变,因此可以静态使用它们。
  • 具有ASLR 但没有PIE知道libc并且二进制文件使用system函数时,可以ret到GOT中system的地址并带有'/bin/sh'的地址(您需要弄清楚这一点)。
  • 具有ASLR但没有PIE知道libc但二进制文件不使用system
  • 使用ret2dlresolve解析system的地址并调用它。
  • 绕过ASLR并计算内存中system'/bin/sh'的地址。
  • 具有ASLR PIE 但不知道libc:您需要:
  • 绕过PIE
  • 找到使用的**libc版本**(泄漏几个函数地址)
  • 检查具有ASLR的先前情况以继续。

通过EBP/RBP

  • Stack Pivoting / EBP2Ret / EBP Chaining: 控制ESP以通过堆栈中存储的EBP控制RET。
  • 对于off-by-one堆栈溢出很有用。
  • 作为控制EIP的替代方式滥用EIP在内存中构造有效负载然后通过EBP跳转到它。

其他

  • Pointers Redirecting: 如果堆栈包含将要被调用的函数或将要被有趣函数如system或printf使用的字符串的指针可以覆盖该地址。
  • ASLRPIE可能会影响地址。
  • 未初始化的变量: 永远不知道
从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS Red Team Expert

支持HackTricks的其他方式