问题标签 [got]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - GOT和GOTOFF之间的区别
我是 32 位汇编的初学者,我尝试将一个简单的 C 程序编译成汇编。我了解其中的大部分内容,除非它使用 GOTOFF。
为什么它使用 GOTOFF?GOT的地址不是已经加载到%eax了吗?GOT 和 GOTOFF 有什么区别?
c - 导入地址表和全局偏移表有什么区别?
我试着分别用谷歌搜索它们,但有一件事最突出。仅仅是IAT用于PE文件而GoT用于ELF吗?
c - 在 gcc 32 位代码中未定义的对“_GLOBAL_OFFSET_TABLE_”的引用,用于一个简单的函数,独立的操作系统
我有一个小的 c 代码文件(function.c):
我使用的是 64 位机器。但是,我想写一个小的 32 位操作系统。我想将代码编译成“纯”程序集/二进制文件。
我编译我的代码:
gcc function.c -c -m32 -o file.o -ffreestanding # This gives you the object file
我将它与:
ld -o function.bin -m elf_i386 -Ttext 0x0 --oformat binary function.o
我收到以下错误:
c - 从 PLT 跳转时的段错误
我试图找出段错误的原因,并使用 gdb 的 btrace 将其缩小到 PLT。段错误发生在从 PLT 跳转到 GOT 的过程中,我将其解释为表示 PLT 在执行过程中损坏。根据下面的分析,这种解释是否正确?PLT 腐败的罪魁祸首是什么?堆栈溢出?我相信在这种情况下,在 GOT 地址上安装一个观察点可能会有所帮助。会watch -l 0x55555562f048
是正确的方法吗?欢迎其他调试想法。
对于上下文,段错误发生在调用strlen
in 函数期间foo
:
相应的装配线是:
首先,path
与 NULL ( cmpq $0x0,-0x4c8(%rbp)
) 进行比较,我相信在这种情况下,它只是为 ubsan 仪器添加的。没有遵循该分支,程序跳转到<foo+234>
,它为strlen
调用设置,通过移动path
到rax
然后rdi
,最后调用strlen@plt
。record btrace
在gdb
此之前运行会产生以下指令历史记录:
在这里,我们看到它path
不为空,因此程序跳转到<foo+234>
,并为strlen
调用 ( mov
, mov
, callq <strlen@plt>
) 设置。最后执行的指令是到GOT ( ) 中jmpq *0xa3fb2(%rip)
的条目,因此程序崩溃并且 gdb 丢失了上下文(报告它)。strlen
strlen@got.plt
Cannot find bounds of current function
c - 对 GOT 所做的更改是否会在反向调试期间被撤销?
是否期望在反向调试期间不会恢复对程序地址空间所做的更改?
我一直在调试一个程序,当strlen
GOT 中的指针在执行过程中损坏时,该程序会出现段错误。感谢来自对此问题的评论的建议,我通过链接选项将该程序的 GOT 设为只读-z relro
;但是,这并不能防止有问题的指针被覆盖。即我可以在gdb中start
的程序,跳到第一次出现的,strlen
验证指针是否有效(例如:程序;例如:),提示.x/g 0x5555555d10a8 ==> 0x5555555d10a8 <strlen@got.plt>: 0x00007ffff7e8d1e0
continue
x/g 0x5555555d10a8 ==>
0x5555555d10a8 <strlen@got.plt>: 0x0000000000002156
segv
但是,如果我record full
整个执行(从第一行到程序段错误),然后awatch
是带有指针的地址strlen
during reverse-continue
,则观察点永远不会触发。当程序最终回到指令#0时,指针仍然指向它在段错误时所拥有的无效地址。
这导致了两个问题。首先,尽管有链接器选项,为什么 GOT 是可变的-z relro
?其次,是否期望strlen
在程序执行期间更改的内存中的某个位置(指向 的指针)在反向执行期间不会恢复到其原始值?
mips - 什么对应于 mips 中 x86 上的 JMPREL
我尝试在 mips 中使用 plthook 代码(https://github.com/kubo/plthook),但它不受支持。所以我现在尝试移植。
在 x86 abi 中,动态部分有 JMPREL。所以允许搬迁。但是在 MIPS 二进制文件中(我通过 gcc 交叉编译器编译了相同的二进制文件)没有它。(plthook 代码使用它)
我试图在 MIPS 中找到动态链接,但我找不到很好的文档。
所以
- 你知道什么对应于 mips 中 x86 上的 JMPREL
- 你知道MIPS的动态链接参考吗??
linux - 为什么 linux 在 x64 中使用两个 GOT 部分?.GOT 与 .got.plt
我试图弄清楚这两个部分之间的区别,这似乎是这个问题的重复,但那里给出的答案并没有解释很多,所以我想要一个更详细和简洁的解释。
gcc - 为什么 MIPS GCC 在函数调用(一个 GOT 指针)之后从 16($fp) 重新加载 28 美元,而没有先存储到 16($fp) ?
我想我需要粘贴完整的代码,虽然它看起来很长。
我写了一个简单的代码进行测试。
组装后:
我意识到在每个函数调用之后,都有一条lw $28,16($fp)
指令。但是我没有看到任何代码会首先在调用者或被调用者中存储一个值。
我可以阅读 MIPS 程序集。我知道这lw
是加载字,以及 $fp 和 $sp 如何是帧指针和堆栈指针。
我只是无法理解从16($fp)
;加载任何内容的意义。似乎有一个未初始化的空间。
我知道$28
是$gp
,并且可以看到它被用作 GOT 指针,以在调用之前加载函数地址,但似乎没有在函数中使用该寄存器之前初始化该寄存器。
MIPS 调用约定是否需要$28
在函数入口处已经指向 GOT?
c - memcpy 真的是一个带符号的函数吗?
这个简单的c:
编译成这样:
stdlib 中的每个函数都类似于printf
或从 GOT 编辑(即寄存器保存 GOT 的地址)。但不是,它就像“汇编内联指令”而不是常规调用地址。甚至是一个符号?如果是这样,为什么不作为论据?在 GOT 表中吗?如果是这样,从 GOT 到该符号的偏移量是多少?puts
call
%rip
memcpy
memcpy
call
memcpy
c - 如何使用 got 从汇编程序中访问 glibc 数据类型?
我正在尝试访问stdin
C FILE* 类型,以便我可以调用 fgets 来获取输入并将其回显。我可以使用 plt 部分来访问 C 函数,但不能.got
以相同的方式使用部分(如果我理解正确,就像 plt 但用于数据),stdin
因为分段错误总是由mov
之后的指令引起lea
构建并与 makefile 链接为