WWW2Exec - .dtors & .fini_array
Last updated
Last updated
学习并练习AWS黑客技术:HackTricks培训AWS红队专家(ARTE) 学习并练习GCP黑客技术:HackTricks培训GCP红队专家(GRTE)
现在很奇怪找到一个带有.dtors部分的二进制文件!
析构函数是在程序结束之前(在main
函数返回后)执行的函数。
这些函数的地址存储在二进制文件的**.dtors
部分中,因此,如果您设法写入一个shellcode的地址到__DTOR_END__
,那么它将在程序结束之前执行**。
使用以下命令获取此部分的地址:
通常你会在值ffffffff
和00000000
之间找到DTOR标记。所以如果你只看到这些值,意味着没有任何函数注册。因此,覆盖 00000000
的地址为shellcode的地址以执行它。
当然,你首先需要找到一个存储shellcode的位置,以便稍后调用它。
本质上,这是一个包含在程序完成之前将被调用的函数的结构,就像**.dtors
一样。如果你可以通过跳转到一个地址调用你的shellcode**,或者在需要再次回到main
以第二次利用漏洞的情况下,这就变得很有趣。
请注意,当执行**.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
**的堆栈上的返回地址以再次调用自身。
请注意,使用Full RELRO,部分.fini_array
部分被设置为只读。 在更新版本中,即使使用[Partial RELRO],.fini_array
部分也被设置为只读。
学习并练习AWS黑客技术:HackTricks培训AWS红队专家(ARTE) 学习并练习GCP黑客技术:HackTricks培训GCP红队专家(GRTE)