1.被執(zhí)行的是shell腳本或perl头遭、python等這種解釋型語言的腳本呛哟,那么它的第一行往往是“#!/bin/sh”或"#!/usr/bin/perl"或“#!/usr/bin/python”,這時候前兩個字節(jié)'#'和'!'就構(gòu)成了魔數(shù)胸梆,系統(tǒng)一旦判斷到這兩個字節(jié)蔗衡,就對后面的字符串進行解析,以確定具體的解釋程序的路徑乳绕。
2.RVA相對虛擬地址、VA虛擬地址逼纸,每個PE文件在裝載時都會有一個裝載目標(biāo)地址洋措,這個地址就是所謂的基地址。
動態(tài)鏈接庫
1.GOT全局偏移表:指向這些變量的指針數(shù)組杰刽。
當(dāng)指令中需要訪問變量b時菠发,程序會先找到GOT,然后根據(jù)GOT中變量所對應(yīng)的項找到變量的目標(biāo)地址贺嫂。
2.查看GOT的位置:
objdump -h pic.so
查看pic.so的需要在動態(tài)鏈接時重定位項:
objdump -R pic.so
PLT的基本原理:
ELF將GOT拆分成兩個表叫做“.got”和".got.plt"滓鸠。其中".got"用來保存全局變量引用的地址,".got.plt"用來保存函數(shù)引用的地址第喳。
1.在linux下查看一個可執(zhí)行文件所需要的動態(tài)鏈接器的路徑:
readelf -l a.out | grep interpreter
查看".dynamic"段的內(nèi)容:
readelf -d lib.so
查看一個程序主模塊或一個共享庫依賴于哪些共享庫:
ldd program1
查看ELF文件的動態(tài)符號表及它的哈希表:
readelf -sD lib.so
查看一個動態(tài)鏈接的文件的重定位表:
readelf -r lib.so/readelf -S lib.so
dlopen()函數(shù):
用來打開一個動態(tài)庫糜俗,并將其加載到進程的地址空間,完成初始化過程
dlsym函數(shù):
是運行時裝載的核心部分曲饱,我們可以通過這個函數(shù)找到所需要的符號悠抹。
dlerror()函數(shù):
用來判斷上一次調(diào)用是否成功。如果返回null扩淀,則表示上一次調(diào)用成功楔敌,如果不是,則返回相應(yīng)的錯誤消息驻谆。
dlclose()函數(shù):
將一個已經(jīng)加載的模塊卸載