114
158
640
高级会员
文章目录 1、程序运行过程 2、代码示例引入 (1)、链接重定向的产生 拓展:静态链接和动态连接 (2)、链接重定向的分析 (3)、GOT和PLT的形成 3、延迟重定位 4、代码验证重定位 5、函数执行流程图
00000000 <print_banner>: 0: push %ebp 1: mov %esp,%ebp 3: sub $0x8,%esp 6: sub $0xc,%esp 9: push $0x0 e: call *printf的地址* 13: add $0x10,%esp 16: nop 17: leave 18: ret
>静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。 > >动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。
> - 调用跳转代码:调用函数的绝对地址然后跳转到动态链接库。 > - 库函数的地址为跳转代码做准备。
//一开始没有重定位的时候将 printf@got 填成 lookup_printf 的地址 void printf@plt() { address_good: jmp *printf@got // 链接器将printf@got填成下一语句lookup_printf的地址 lookup_printf: 调用重定位函数查找printf地址,并写到printf@got goto address_good; }
Disassembly of section .plt: 080482d0 <common@plt-0x10>: 80482d0: ff 35 04 a0 04 08 pushl 0x804a004 80482d6: ff 25 08 a0 04 08 jmp *0x804a008 80482dc: 00 00 add %al,(%eax) ... 080482e0 <puts@plt>: 80482e0: ff 25 0c a0 04 08 jmp *0x804a00c 80482e6: 68 00 00 00 00 push $0x0 80482eb: e9 e0 ff ff ff jmp 80482d0 <_init+0x28> 080482f0 <__libc_start_main@plt>: 80482f0: ff 25 10 a0 04 08 jmp *0x804a010 80482f6: 68 08 00 00 00 push $0x8 80482fb: e9 d0 ff ff ff jmp 80482d0 <_init+0x28>
【1】https://mp.weixin.qq.com/s?__biz ... 8a1fcbc183d841c4#rd 【2】https://blog.csdn.net/linyt/article/details/51635768 【3】https://blog.csdn.net/linyt/arti ... _relevant.none-task 【4】https://blog.csdn.net/linyt/arti ... _relevant.none-task 【5】https://blog.csdn.net/linyt/arti ... _relevant.none-task
使用道具 举报
本版积分规则 发表回复 回帖后跳转到最后一页
小黑屋|安全矩阵
GMT+8, 2024-11-28 00:44 , Processed in 0.020531 second(s), 18 queries .
Powered by Discuz! X4.0
Copyright © 2001-2020, Tencent Cloud.