4.9 KiB
WWW2Exec - .dtors & .fini_array
{% hint style="success" %}
学习并练习AWS黑客技术:HackTricks培训AWS红队专家(ARTE)
学习并练习GCP黑客技术:HackTricks培训GCP红队专家(GRTE)
支持HackTricks
- 检查订阅计划!
- 加入 💬 Discord群组 或 电报群组 或 关注我们的Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud github仓库提交PR来分享黑客技巧。
.dtors
{% hint style="danger" %} 现在很奇怪找到一个带有.dtors部分的二进制文件! {% endhint %}
析构函数是在程序结束之前(在main
函数返回后)执行的函数。
这些函数的地址存储在二进制文件的**.dtors
部分中,因此,如果您设法写入一个shellcode的地址到__DTOR_END__
,那么它将在程序结束之前执行**。
使用以下命令获取此部分的地址:
objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”
通常你会在值ffffffff
和00000000
之间找到DTOR标记。所以如果你只看到这些值,意味着没有任何函数注册。因此,覆盖 00000000
的地址为shellcode的地址以执行它。
{% hint style="warning" %} 当然,你首先需要找到一个存储shellcode的位置,以便稍后调用它。 {% endhint %}
.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
中的一个函数时,它会移动到下一个函数,因此不会被多次执行(防止无限循环),但它也只会给你一个在这里放置的函数执行**。
请注意,.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
**的堆栈上的返回地址以再次调用自身。
{% hint style="danger" %}
请注意,使用Full RELRO,部分.fini_array
部分被设置为只读。
在更新版本中,即使使用[Partial RELRO],.fini_array
部分也被设置为只读。
{% endhint %}
{% hint style="success" %}
学习并练习AWS黑客技术:HackTricks培训AWS红队专家(ARTE)
学习并练习GCP黑客技术:HackTricks培训GCP红队专家(GRTE)
支持HackTricks
- 查看订阅计划!
- 加入 💬 Discord群 或 电报群 或在Twitter 🐦 @hacktricks_live上关注我们。
- 通过向HackTricks和HackTricks Cloud github仓库提交PR来分享黑客技巧。