GOT(Global Offset Table,全局偏移表)是Linux ELF文件中用于定位全局變量和函數的一個表。PLT(Procedure Linkage Table,過程鏈接表)是Linux ELF文件中用于延遲綁定的表,即函數第一次被調用的時候才進行綁定。
所謂延遲綁定,就是當函數第一次被調用的時候才進行綁定(包括符號查找、重定位等),如果函數從來沒有用到過就不進行綁定。基于延遲綁定可以大大加快程序的啟動速度,特別有利于一些引用了大量函數的程序
假如存在一個bar函數,這個函數在PLT中的條目為bar@plt,在GOT中的條目為bar@got,那么在第一次調用bar函數的時候,首先會跳轉到PLT,偽代碼如下:
plt got、bar@plt:
jmp bar@got
patch bar@got
這里會從PLT跳轉到GOT,如果函數從來沒有調用過,那么這時候GOT會跳轉回PLT并調用patch bar@got,這一行代碼的作用是將bar函數真正的地址填充到bar@got,然后跳轉到bar函數真正的地址執行代碼。當我們下次再調用bar函數的時候,執行路徑就是先后跳轉到bar@plt、bar@got、bar真正的地址。具體來看個實例:
GOT表、vulnerable_function函數調用了read函數,由于read函數是動態鏈接加載進來的只有在鏈接的時候才知道地址,編譯時并不知道地址
?
執行call _read函數會跳到plt表中尋找中:
什么是PLT,
plt表中會繼續跳入到got表中尋找
got表中的所存的read函數的地址便是在pwn6進程中的實際地址,也就是
PLT全稱、
?
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态