问题标签 [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.

0 投票
1 回答
509 浏览

assembly - GOT和GOTOFF之间的区别

我是 32 位汇编的初学者,我尝试将一个简单的 C 程序编译成汇编。我了解其中的大部分内容,除非它使用 GOTOFF。

为什么它使用 GOTOFF?GOT的地址不是已经加载到%eax了吗?GOT 和 GOTOFF 有什么区别?

0 投票
2 回答
466 浏览

c - 导入地址表和全局偏移表有什么区别?

我试着分别用谷歌搜索它们,但有一件事最突出。仅仅是IAT用于PE文件而GoT用于ELF吗?

0 投票
2 回答
1007 浏览

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

我收到以下错误:

0 投票
0 回答
269 浏览

c - 从 PLT 跳转时的段错误

我试图找出段错误的原因,并使用 gdb 的 btrace 将其缩小到 PLT。段错误发生在从 PLT 跳转到 GOT 的过程中,我将其解释为表示 PLT 在执行过程中损坏。根据下面的分析,这种解释是否正确?PLT 腐败的罪魁祸首是什么?堆栈溢出?我相信在这种情况下,在 GOT 地址上安装一个观察点可能会有所帮助。会watch -l 0x55555562f048是正确的方法吗?欢迎其他调试想法。


对于上下文,段错误发生在调用strlenin 函数期间foo

相应的装配线是:

首先,path与 NULL ( cmpq $0x0,-0x4c8(%rbp)) 进行比较,我相信在这种情况下,它只是为 ubsan 仪器添加的。没有遵循该分支,程序跳转到<foo+234>,它为strlen调用设置,通过移动pathrax然后rdi,最后调用strlen@pltrecord btracegdb此之前运行会产生以下指令历史记录:

在这里,我们看到它path不为空,因此程序跳转到<foo+234>,并为strlen调用 ( mov, mov, callq <strlen@plt>) 设置。最后执行的指令是到GOT ( ) 中jmpq *0xa3fb2(%rip)的条目,因此程序崩溃并且 gdb 丢失了上下文(报告它)。strlenstrlen@got.pltCannot find bounds of current function

0 投票
2 回答
98 浏览

c - 对 GOT 所做的更改是否会在反向调试期间被撤销?

是否期望在反向调试期间不会恢复对程序地址空间所做的更改?

我一直在调试一个程序,当strlenGOT 中的指针在执行过程中损坏时,该程序会出现段错误。感谢来自对此问题的评论的建议,我通过链接选项将该程序的 GOT 设为只读-z relro;但是,这并不能防止有问题的指针被覆盖。即我可以在gdb中start的程序,跳到第一次出现的,strlen验证指针是否有效(例如:程序;例如:),提示.x/g 0x5555555d10a8 ==> 0x5555555d10a8 <strlen@got.plt>: 0x00007ffff7e8d1e0continuex/g 0x5555555d10a8 ==> 0x5555555d10a8 <strlen@got.plt>: 0x0000000000002156segv

但是,如果我record full整个执行(从第一行到程序段错误),然后awatch是带有指针的地址strlenduring reverse-continue,则观察点永远不会触发。当程序最终回到指令#0时,指针仍然指向它在段错误时所拥有的无效地址。

这导致了两个问题。首先,尽管有链接器选项,为什么 GOT 是可变的-z relro?其次,是否期望strlen在程序执行期间更改的内存中的某个位置(指向 的指针)在反向执行期间不会恢复到其原始值?

0 投票
0 回答
83 浏览

mips - 什么对应于 mips 中 x86 上的 JMPREL

我尝试在 mips 中使用 plthook 代码(https://github.com/kubo/plthook),但它不受支持。所以我现在尝试移植。

在 x86 abi 中,动态部分有 JMPREL。所以允许搬迁。但是在 MIPS 二进制文件中(我通过 gcc 交叉编译器编译了相同的二进制文件)没有它。(plthook 代码使用它)

我试图在 MIPS 中找到动态链接,但我找不到很好的文档。

所以

  1. 你知道什么对应于 mips 中 x86 上的 JMPREL
  2. 你知道MIPS的动态链接参考吗??
0 投票
1 回答
198 浏览

linux - 为什么 linux 在 x64 中使用两个 GOT 部分?.GOT 与 .got.plt

我试图弄清楚这两个部分之间的区别,这似乎是这个问题的重复,但那里给出的答案并没有解释很多,所以我想要一个更详细和简洁的解释。

0 投票
2 回答
331 浏览

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?

0 投票
1 回答
182 浏览

c - memcpy 真的是一个带符号的函数吗?

这个简单的c:

编译成这样:

stdlib 中的每个函数都类似于printf或从 GOT 编辑(即寄存器保存 GOT 的地址)。但不是,它就像“汇编内联指令”而不是常规调用地址。甚至是一个符号?如果是这样,为什么不作为论据?在 GOT 表中吗?如果是这样,从 GOT 到该符号的偏移量是多少?putscall%ripmemcpymemcpycallmemcpy

0 投票
0 回答
50 浏览

c - 如何使用 got 从汇编程序中访问 glibc 数据类型?

我正在尝试访问stdinC FILE* 类型,以便我可以调用 fgets 来获取输入并将其回显。我可以使用 plt 部分来访问 C 函数,但不能.got以相同的方式使用部分(如果我理解正确,就像 plt 但用于数据),stdin因为分段错误总是由mov之后的指令引起lea

构建并与 makefile 链接为