hacktricks/binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md

4.9 KiB
Raw Blame History

WWW2Exec - .dtors & .fini_array

{% hint style="success" %} 学习并练习AWS黑客技术HackTricks培训AWS红队专家ARTE
学习并练习GCP黑客技术HackTricks培训GCP红队专家GRTE

支持HackTricks
{% endhint %}

.dtors

{% hint style="danger" %} 现在很奇怪找到一个带有.dtors部分的二进制文件 {% endhint %}

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

使用以下命令获取此部分的地址:

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

通常你会在值ffffffff00000000之间找到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
{% endhint %}