assembly 无法调试GOT表惰性解析;在第一次调用之前已解析的条目

7cwmlq89  于 2023-04-21  发布在  Go
关注(0)|答案(1)|浏览(69)

我有一个使用动态库的小程序,我想按照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_NOWLD_BIND_NOW没有定义,-z norelro没有任何效果(我通过使用checksec检查该选项是否生效)。

xkftehaa

xkftehaa1#

我的问题是动态库的地址解析是在加载可执行文件时完成的(而不是使用惰性链接)。
为了避免它,我在编译可执行文件时添加了这些标志:-z lazy -z norelro

相关问题