链接为 RELRO 时的 ELF link_map

逆向工程 linux 小精灵 拿到 血小板
2021-06-19 10:08:47

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

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

当使用完整的 RELRO 编译时,如果在任何地方,可以在link_map不咨询其他加载的库的情况下获得的副本,或者libdl

人们期望它出现的地方——在标有标签的部分DT_PLTGOT——它没有出现。相反,只有一个返回类型为 Program Header 的链接PT_DYNAMIC标记的段中的槽以段DT_GOTPLT的偏移量开始DYNAMIC,并且不包含任何指向链接映射的指针。

标题

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

二进制是 RELRO

$ 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

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

$ gdb ./amd64-relro
gdb-peda$ start
gdb-peda$ vmmap relro
Start              End                Perm      Name
0x0000555555554000 0x0000555555556000 r-xp      /home/user/pwntools-regression/src/amd64-relro
0x0000555555756000 0x0000555555757000 r-xp      /home/user/pwntools-regression/src/amd64-relro
0x0000555555757000 0x0000555555758000 rwxp      /home/user/pwntools-regression/src/amd64-relro
gdb-peda$ telescope 0x0000555555554000+0x202eb8 5
00:0000|  0x555555756eb8 --> 0x202ca8 
01:0008|  0x555555756ec0 --> 0x0 
02:0016|  0x555555756ec8 --> 0x0 
03:0024|  0x555555756ed0 --> 0x7ffff7675870 (<__GI___libc_free>:        mov    rax,QWORD PTR [rip+0x33b671]        # 0x7ffff79b0ee8)
04:0032|  0x555555756ed8 --> 0x7ffff79c0430 (<__pthread_create_2_1>:    push   rbp)
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