1.被执行的是shell脚本或perl、python等这种解释型语言的脚本,那么它的第一行往往是“#!/bin/sh”或"#!/usr/bin/perl"或“#!/usr/bin/python”,这时候前两个字节'#'和'!'就构成了魔数,系统一旦判断到这两个字节,就对后面的字符串进行解析,以确定具体的解释程序的路径。
2.RVA相对虚拟地址、VA虚拟地址,每个PE文件在装载时都会有一个装载目标地址,这个地址就是所谓的基地址。
动态链接库
1.GOT全局偏移表:指向这些变量的指针数组。
当指令中需要访问变量b时,程序会先找到GOT,然后根据GOT中变量所对应的项找到变量的目标地址。
2.查看GOT的位置:
objdump -h pic.so
查看pic.so的需要在动态链接时重定位项:
objdump -R pic.so
PLT的基本原理:
ELF将GOT拆分成两个表叫做“.got”和".got.plt"。其中".got"用来保存全局变量引用的地址,".got.plt"用来保存函数引用的地址。
1.在linux下查看一个可执行文件所需要的动态链接器的路径:
readelf -l a.out | grep interpreter
查看".dynamic"段的内容:
readelf -d lib.so
查看一个程序主模块或一个共享库依赖于哪些共享库:
ldd program1
查看ELF文件的动态符号表及它的哈希表:
readelf -sD lib.so
查看一个动态链接的文件的重定位表:
readelf -r lib.so/readelf -S lib.so
dlopen()函数:
用来打开一个动态库,并将其加载到进程的地址空间,完成初始化过程
dlsym函数:
是运行时装载的核心部分,我们可以通过这个函数找到所需要的符号。
dlerror()函数:
用来判断上一次调用是否成功。如果返回null,则表示上一次调用成功,如果不是,则返回相应的错误消息。
dlclose()函数:
将一个已经加载的模块卸载