WWW2Exec - .dtors & .fini_array
Last updated
Last updated
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
如今找到一个带有 .dtors 部分的二进制文件是非常奇怪的!
析构函数是在程序结束之前(在 main
函数返回后)执行的函数。
这些函数的地址存储在二进制文件的 .dtors
部分,因此,如果你设法将 地址 写入 __DTOR_END__
的 shellcode 中,那么它将在程序结束之前被 执行。
获取此部分的地址:
通常你会在 DTOR 标记 之间 找到值 ffffffff
和 00000000
。所以如果你只看到这些值,这意味着 没有注册任何函数。所以 覆盖 00000000
为 shellcode 的 地址 以执行它。
当然,你首先需要找到一个 存储 shellcode 的地方 以便稍后调用它。
本质上这是一个结构,包含 在程序结束前将被调用的函数,就像 .dtors
。如果你可以通过 跳转到一个地址 来调用你的 shellcode,或者在需要 再次返回 main
以 第二次利用漏洞 的情况下,这一点很有趣。
注意,当执行 .fini_array
中的一个函数时,它会移动到下一个函数,因此不会被多次执行(防止永恒循环),但它只会给你 1 次在这里放置的 函数执行。
注意,.fini_array
中的条目是按 反向 顺序调用的,因此你可能想从最后一个开始写。
为了利用 .fini_array
造成永恒循环,你可以 查看这里所做的: 如果你在 .fini_array
中至少有 2 个条目,你可以:
使用你的第一次写入来 再次调用易受攻击的任意写入函数
然后,计算由 __libc_csu_fini
存储在栈中的返回地址(调用所有 .fini_array
函数的函数),并将 __libc_csu_fini
的 地址放在那里
这将使 __libc_csu_fini
再次调用自己,执行 .fini_array
函数,这将使易受攻击的 WWW 函数被调用 2 次:一次用于 任意写入,另一次用于再次覆盖栈上 __libc_csu_fini
的返回地址以再次调用自己。
注意,在 完全 RELRO, 部分 .fini_array
被设置为 只读。 在较新版本中,即使是 [部分 RELRO],部分 .fini_array
也被设置为 只读。
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术: HackTricks 培训 GCP 红队专家 (GRTE)