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
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
.dtors
caution
现在找到一个带有 .dtors 部分的二进制文件是非常奇怪的!
析构函数是在程序结束之前(在 main
函数返回后)执行的函数。
这些函数的地址存储在二进制文件的 .dtors
部分,因此,如果你设法将 地址 写入 __DTOR_END__
的 shellcode,那么它将在程序结束之前被 执行。
获取此部分的地址:
objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”
通常,您会在值 ffffffff
和 00000000
之间找到 DTOR 标记。因此,如果您只看到这些值,这意味着 没有注册任何函数。所以 用 shellcode 的 地址 覆盖 00000000
以执行它。
warning
当然,您首先需要找到一个 存储 shellcode 的地方 以便稍后调用它。
.fini_array
本质上,这是一个在程序结束之前会被调用的 函数 结构,类似于 .dtors
。如果您可以通过 跳转到一个地址 来调用您的 shellcode,或者在需要 再次返回 main
以 第二次利用漏洞 的情况下,这一点很有趣。
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
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。