我有一个使用动态库的小程序,我想按照GOT解析。我在调用_print_string
时达到了以下几行。现在,第一行应该先设置为下一行push $0x0
,以求解_print_string
的实际地址。但是当逐行执行时,_print_string
的正确地址已经存储在GOT中。我运行gdb,在_print_string@plt
处设置断点并执行run命令。我使用的库是共享库(不是静态库)。
0x0000555555555030 ? jmp *0x2f8a(%rip) # 0x555555557fc0 <_print_string@got.plt>
0x0000555555555036 ? push $0x0
0x000055555555503b ? jmp 0x555555555020
编辑:
这里是main函数的初始代码(我的程序是用at&t汇编x86-64架构编写的)。我只是在函数调用之前粘贴了代码。
.global main
.type main function
main:
push %rbp
mov %rsp, %rbp
push %rdi # argc (%rbp - 8)
push %rsi # argv (%rbp - 16)
push $0 # index (i) (%rbp - 24)
leaq nargsmsg(%rip), %rdi
call _print_string
编辑2:
一个小例子,我的GOT条目的看跌期权已经解决了
.global main
.type main function
.text
main:
push %rbp
mov %rsp, %rbp
leaq string(%rip), %rdi
call puts
mov $0, %rax
leave
ret
.data
string: .asciz "Hello world\n"
编辑3:
1.我正在使用gdb-dashboard,但禁用它并没有影响这个问题。
1.我试着用-z norelro
编译并检查是否定义了LD_BIND_NOW
。LD_BIND_NOW
没有定义,-z norelro
没有任何效果(我通过使用checksec
检查该选项是否生效)。
1条答案
按热度按时间xkftehaa1#
我的问题是动态库的地址解析是在加载可执行文件时完成的(而不是使用惰性链接)。
为了避免它,我在编译可执行文件时添加了这些标志:
-z lazy -z norelro