WWW2Exec - .dtors & .fini_array

Reading time: 4 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

.dtors

caution

现在找到一个带有 .dtors 部分的二进制文件是非常奇怪的

析构函数是在程序结束之前(在 main 函数返回后)执行的函数。
这些函数的地址存储在二进制文件的 .dtors 部分,因此,如果你设法将 地址 写入 __DTOR_END__shellcode,那么它将在程序结束之前被 执行

获取此部分的地址:

bash
objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”

通常,您会在值 ffffffff00000000 之间找到 DTOR 标记。因此,如果您只看到这些值,这意味着 没有注册任何函数。所以 shellcode地址 覆盖 00000000 以执行它。

warning

当然,您首先需要找到一个 存储 shellcode 的地方 以便稍后调用它。

.fini_array

本质上,这是一个在程序结束之前会被调用的 函数 结构,类似于 .dtors。如果您可以通过 跳转到一个地址 来调用您的 shellcode,或者在需要 再次返回 main第二次利用漏洞 的情况下,这一点很有趣。

bash
objdump -s -j .fini_array ./greeting

./greeting:     file format elf32-i386

Contents of section .fini_array:
8049934 a0850408

#Put your address in 0x8049934

注意,当执行 .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 的返回地址以再次调用自己。

caution

注意,在 完全 RELRO, 部分 .fini_array 被设置为 只读。 在较新的版本中,即使是 [部分 RELRO],部分 .fini_array 也被设置为 只读

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks