Basic Stack Binary Exploitation Methodology
Last updated
Last updated
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
在开始利用任何东西之前,了解 ELF 二进制文件 的部分结构是很有趣的:
ELF Basic Information有这么多技术时,拥有一个每种技术何时有用的方案是好的。请注意,相同的保护措施会影响不同的技术。您可以在每个保护部分找到绕过保护的方法,但在此方法论中没有。
您可以通过不同的方式控制程序的流程:
堆栈溢出 通过覆盖堆栈中的返回指针或 EBP -> ESP -> EIP。
可能需要利用 整数溢出 来导致溢出。
或通过 任意写入 + 写入什么到哪里执行。
格式字符串: 利用 printf
在任意地址写入任意内容。
数组索引:利用设计不良的索引来控制某些数组并获得任意写入。
可能需要利用 整数溢出 来导致溢出。
bof 到 WWW 通过 ROP:利用缓冲区溢出构造 ROP 并能够获得 WWW。
您可以在以下位置找到 写入什么到哪里执行 技术:
Write What Where 2 Exec需要考虑的一点是,通常 仅仅一次利用漏洞可能不足以执行成功的利用,特别是某些保护需要被绕过。因此,讨论一些选项以 使单个漏洞在同一二进制执行中可利用多次 是很有趣的:
在 ROP 链中写入 main
函数 的地址或发生 漏洞 的地址。
控制一个合适的 ROP 链,您可能能够在该链中执行所有操作。
在 GOT 中写入 exit
地址(或二进制在结束前使用的任何其他函数)到 返回漏洞 的地址。
如 .fini_array 中所述,存储两个函数,一个是再次调用漏洞,另一个是调用 __libc_csu_fini
,它将再次调用 .fini_array
中的函数。
ret2win:代码中有一个您需要调用的函数(可能带有一些特定参数)以获取标志。
在带有 PIE 的 bof 中,您需要绕过它。
在带有 canary 的 bof 中,您需要绕过它。
如果您需要设置多个参数以正确调用 ret2win 函数,您可以使用:
如果有足够的 gadget,可以使用 ROP 链来准备所有参数。
SROP(如果您可以调用此系统调用)以控制许多寄存器。
通过 写入什么到哪里 您可以利用其他漏洞(不是 bof)来调用 win
函数。
指针重定向:如果堆栈包含指向将要调用的函数或将要被有趣的函数(system 或 printf)使用的字符串的指针,则可以覆盖该地址。
未初始化变量:你永远不知道。
(堆栈) Shellcode:这对于在覆盖返回指针之前或之后将 shellcode 存储在堆栈中并然后 跳转到它 以执行它非常有用:
在任何情况下,如果有一个 canary**,**在常规 bof 中,您需要绕过(泄漏)它。
有 ASLR,您需要使用 ret2esp/ret2reg 等技术来跳转到它。
这将把 shellcode 与 ROP 链混合。
Ret2syscall: 有用来调用 execve
以运行任意命令。您需要能够找到 调用特定系统调用的 gadget 及其参数。
SROP 可以用于准备 ret2execve。
Ret2lib: 有用来调用库中的函数(通常是 libc
)如 system
,并带有一些准备好的参数(例如 '/bin/sh'
)。您需要二进制文件 加载库,以便调用您想要的函数(通常是 libc)。
如果 静态编译且没有 PIE,system
和 /bin/sh
的 地址 不会改变,因此可以静态使用它们。
没有 ASLR 并且知道加载的 libc 版本,system
和 /bin/sh
的 地址 不会改变,因此可以静态使用它们。
使用 ret2dlresolve
来解析 system
的地址并调用它。
绕过 ASLR 并计算 system
和 '/bin/sh'
在内存中的地址。
绕过 PIE。
找到使用的 libc
版本(泄漏几个函数地址)。
检查 带有 ASLR 的先前场景 以继续。
堆栈转移 / EBP2Ret / EBP 链接:控制 ESP 以通过堆栈中存储的 EBP 控制 RET。
对于 off-by-one 堆栈溢出很有用。
作为一种替代方法,在滥用 EIP 构造内存中的有效负载后,通过 EBP 跳转到它。
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)