-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