mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 22:20:43 +00:00
.. | ||
tools | ||
elf-tricks.md | ||
README.md |
基本二进制利用方法论
{% hint style="success" %}
学习并练习 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习并练习 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
支持 HackTricks
- 查看订阅计划!
- 加入 💬 Discord 群组 或 电报群组 或 关注我们的Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享黑客技巧。
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:代码中有一个需要调用的函数(可能带有一些特定参数)以获取标志。
- 在没有 PIE 和 canary 的常规 bof 中,只需在栈中存储的返回地址中写入地址。
- 在带有 PIE 的 bof 中,您将需要绕过它
- 在带有 canary 的 bof 中,您将需要绕过它
- 如果需要设置多个参数以正确调用 ret2win 函数,可以使用:
- 如果有足够的 gadget,可以使用 ROP 链来准备所有参数
- SROP(如果可以调用此系统调用)来控制许多寄存器
- 来自 ret2csu 和 ret2vdso 的 gadget 来控制多个寄存器
- 通过 Write What Where,您可以滥用其他漏洞(非 bof)来调用
win
函数。 - 指针重定向:如果栈包含将要调用的函数的指针,或者包含将要被有趣函数(system 或 printf)使用的字符串的指针,可以覆盖该地址。
- ASLR 或 PIE 可能会影响地址。
- 未初始化变量:你永远不知道。
目标:RCE
通过 shellcode,如果 nx 禁用或将 shellcode 与 ROP 混合:
- (Stack) Shellcode:这对于在栈中存储 shellcode 并在覆盖返回指针之前或之后跳转到它以执行它非常有用:
- 在任何情况下,如果有 canary,在常规 bof 中,您将需要绕过(泄漏)它
- 没有 ASLR 和 nx,可以跳转到栈的地址,因为它永远不会改变
- 有 ASLR,您将需要使用诸如 ret2esp/ret2reg 的技术来跳转到它
- 有 nx,您将需要使用一些 ROP 来调用
memprotect
并使某些页面rwx
,然后 在那里存储 shellcode(例如调用 read)然后跳转到那里。 - 这将混合 shellcode 与 ROP 链。
通过系统调用
- Ret2syscall: 用于调用
execve
以运行任意命令。您需要能够找到调用特定系统调用的参数的gadgets。 - 如果启用了ASLR或PIE,您需要打败它们以使用二进制文件或库中的ROP gadgets。
- SROP可用于准备ret2execve
- 来自ret2csu和ret2vdso的gadgets可用于控制多个寄存器
通过libc
- Ret2lib: 用于调用库中的函数(通常来自**
libc
)如system
并带有一些准备好的参数(例如'/bin/sh'
)。您需要二进制文件加载包含您想要调用的函数的库**(通常是libc)。 - 如果静态编译且没有PIE,
system
和/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)使用的字符串的指针,可以覆盖该地址。
- ASLR或PIE可能会影响地址。
- 未初始化的变量: 永远不知道
{% hint style="success" %}
学习并练习AWS黑客技术:HackTricks培训AWS红队专家(ARTE)
学习并练习GCP黑客技术:HackTricks培训GCP红队专家(GRTE)
支持HackTricks
- 查看订阅计划!
- 加入 💬 Discord群 或 电报群 或 关注我们的Twitter 🐦 @hacktricks_live.
- 通过向HackTricks和HackTricks Cloud github仓库提交PR来分享黑客技巧。