-
-
elf---PLT和GOT节相关的细节
-
发表于: 2020-12-1 09:42 3535
-
PLT, Procedure Linkage Table, 过程链接表
GOT, Global Offset Table, 全局偏移表
简略来说就是从PLT去GOT找api真实地址。
有一个延迟绑定的机制,默认开启,和这2个表有关。延迟绑定大概就是说我先不绑定提到的api,等你用的时候我再绑定你用的api,这样来避免启动时间浪费。有的人可能就想,我就不延迟绑定,我不在乎启动时间,我就要直接全部绑定好,用的时候不就快了吗,也可以,因为延迟绑定是可以关闭的。
观察elf,发现有4个相关的节,分别是:
下面举个例子,看一下节的关系,代码如下(后面都用这个例子):
朴实无华的helloworld,先默认编译:
然后用IDA看一下printf是怎么找到的(这里优化成了puts):
点一下 _puts
,来到了 .plt:
跟过去,到了 .got.plt:
加 -z now
选项,可以关闭延迟绑定,编译命令如下:
然后用IDA跟踪一下:
点一下 puts
,来到了 .plt.got:
跟过去,到了 .got:
跟踪下来可以确定:
如果开启了延迟绑定(默认情况),节跳转是:
如果关闭了延迟绑定(-z now),节跳转是:
感谢atQ4n
20201201
.plt
.plt.got
.got
.got.plt
.plt
.plt.got
.got
.got.plt
/
/
test.c x64
#include <stdio.h>
int
main(){
printf(
"Hello World!\n"
);
return
0
;
}
/
/
test.c x64
#include <stdio.h>
int
main(){
printf(
"Hello World!\n"
);
return
0
;
}
gcc
-
o test test.c
gcc
-
o test test.c
.text:
0000000000400526
main proc near ; DATA XREF: _start
+
1D
↑o
.text:
0000000000400526
; __unwind {
.text:
0000000000400526
push rbp
.text:
0000000000400527
mov rbp, rsp
.text:
000000000040052A
mov edi, offset s ;
"Hello World!"
.text:
000000000040052F
call _puts
.text:
0000000000400534
mov eax,
0
.text:
0000000000400539
pop rbp
.text:
000000000040053A
retn
.text:
000000000040053A
; }
/
/
starts at
400526
.text:
000000000040053A
main endp
.text:
0000000000400526
main proc near ; DATA XREF: _start
+
1D
↑o
.text:
0000000000400526
; __unwind {
.text:
0000000000400526
push rbp
.text:
0000000000400527
mov rbp, rsp
.text:
000000000040052A
mov edi, offset s ;
"Hello World!"
.text:
000000000040052F
call _puts
.text:
0000000000400534
mov eax,
0
.text:
0000000000400539
pop rbp
.text:
000000000040053A
retn
.text:
000000000040053A
; }
/
/
starts at
400526
.text:
000000000040053A
main endp
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
- [求助]关于注册表项关闭windows的ASLR功能 1792
- ghidra---配置获取加载pdb文件 349
- [原创]windbg相关 1842
- [分享]x64dbg---调试dll的指定导出函数 7588
- 低版本VMP脱壳 4193
看原图
赞赏
雪币:
留言: