当将二进制文件与-Wl,-z,relro,-z,now链接时,所有重定位都在启动时执行,然后再将控制权传递给二进制文件。

,因此不需要.got.plt段。通常,在此段中存储指向链接器link_map结构的指针。

使用完整RELRO进行编译时,在任何地方都可以在不咨询其他已加载库或link_map的情况下获取libdl的副本的情况。 ?

在标签DT_PLTGOT标记的段中,该位置不会出现。相反,只有指向PT_DYNAMIC类型的程序头的链接。标为DT_GOTPLT的段中的插槽以DYNAMIC部分的偏移量开头,并且不包含任何指向链接映射的指针。


br />二进制是RELRO

$ readelf -a amd64-pwntest-relro | egrep -i '(_dynamic|pltgot)'
 0x0000000000000003 (PLTGOT)             0x202eb8
    48: 0000000000202ca8     0 OBJECT  LOCAL  DEFAULT   21 _DYNAMIC


GDB显示在运行时指定偏移量的数据不包含链接映射指针。

$ checksec.sh --file amd64-relro
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FILE
Full RELRO      No canary found   NX disabled   PIE enabled     No RPATH   No RUNPATH   amd64-relro


#1 楼

如果二进制文件在DT_DEBUG区域中具有PT_DYNAMIC条目,则它将在动态链接器中填充指向r_debug符号的指针。

test:00007F17ED7DDDB0 Elf64_Dyn <DT_SYMENT, 18h>
test:00007F17ED7DDDB0 Elf64_Dyn <DT_DEBUG, offset _r_debug>
test:00007F17ED7DDDB0 Elf64_Dyn <DT_PLTGOT, offset _GLOBAL_OFFSET_TABLE_>


r_debug中的第二个字段是指向link_map的指针:

debug001:00007F17ED5DC1A0 _r_debug dd 1                                    ; r_version
debug001:00007F17ED5DC1A0 db 0, 0, 0, 0
debug001:00007F17ED5DC1A0 dq offset _link_map_head                ; r_map
debug001:00007F17ED5DC1A0 dq offset _dl_debug_state               ; r_brk
debug001:00007F17ED5DC1A0 dd RT_ADD                               ; r_state
debug001:00007F17ED5DC1A0 db 0, 0, 0, 0
debug001:00007F17ED5DC1A0 dq 7F17ED3B8000h                        ; r_ldbase


评论


糟糕的是,剥离二进制文件似乎没有其他任何方法。

–扎克步枪
2014-10-25 22:50

即使是已剥离的二进制文件也具有动态部分,通常它包含DT_DEBUG条目,那么怎么了?

–伊戈尔·斯科钦斯基♦
14-10-26在0:24

复习后,看来我误解了您的帖子。 DT_DEBUG条目在运行时填充。我弄错了readelf-一个显示该插槽0的二进制文件的输出,表示它不包含有用的数据。根据GDB进行的检查显示它已填充。

–扎克步枪
14-10-28在2:17



太棒了,再次感谢!刚刚对pwntools提出了请求,以利用此优势。与将GOT指针泄漏到libc并执行scandown然后解析elf头相比,节省了大约30秒(运行时间的50%;网络通信缓慢)。

–扎克步枪
14-10-28在9:01