1. 程式人生 > 其它 >深入理解GOT表和PLT表

深入理解GOT表和PLT表

0x01 前言

作業系統通常使用動態連結的方法來提高程式執行的效率。在動態連結的情況下,程式載入的時候並不會把連結庫中所有函式都一起載入進來,而是程式執行的時候按需載入,如果有函式並沒有被呼叫,那麼它就不會在程式生命中被載入進來。這樣的設計就能提高程式執行的流暢度,也減少了記憶體空間。而且現代作業系統不允許修改程式碼段,只能修改資料段,那麼GOT表與PLT表就應運而生。

0x02 初探GOT表和PLT表

我們先簡單看一個例子

我們跟進一下scanf@plt

會發現,有三行程式碼

看函式的名字就可以知道這是scanf函式的plt表,先不著急去了解plt是做什麼用的,我們繼續往下看我們先看一下第一個jmp是什麼跳到哪裡。

其實這是plt表對應函式的got表,而且我們會發現0x201020的值是壓棧命令的地址,其他地方為0,此時就想問:

一、got表與plt表有什麼意義,為什麼要跳來跳去?

二、got表與plt表有什麼聯絡,有木有什麼對應關係?

那麼帶著疑問先看答案,再去印證我們要明白作業系統通常使用動態連結的方法來提高程式執行的效率,而且不能回寫到程式碼段上。

在上面例子中我們可以看到,call scanf —> scanf的plt表 —>scanf的got表,至於got表的值暫時先不管,我們此刻可以形成這樣一個思維,它能從got表中找到真實的scanf函式供程式載入執行。

我們這麼認為後,那麼這就變成了一個間接定址的過程

我們就把獲取資料段存放函式地址的那一小段程式碼稱為PLT(Procedure Linkage Table)過程連結表存放函式地址的資料段稱為GOT(Global Offset Table)全域性偏移表。我們形成這麼一個思維後,再去仔細理解裡面的細節。

0x03 再探GOT表和PLT表

已經明白了這麼一個大致過程後,我們來看一下這其中是怎麼一步一步呼叫的上面有幾個疑點需要去解決:

一、got表怎麼知道scanf函式的真實地址?

二、got表與plt表的結構是什麼?我們先來看plt表剛才發現scanf@plt表低三行程式碼是 jmp 一個地址 ,跟進看一下是什麼

其實這是一個程式PLT表的開始(plt[0]),它做的事情是:

後面是每個函式的plt表。此時我們再看一下這個神祕的GOT表

除了這兩個(printf和scanf函式的push 0xn的地址,也就是對應的plt表的第二條程式碼的地址),其它的got[1], got[2] 為0,那麼plt表指向為0的got表幹什麼呢?因為我們落下了一個條件,現代作業系統不允許修改程式碼段,只能修改資料段,也就是回寫,更專業的稱謂應該是執行時重定位。我們把程式執行起來,我們之前的地址和儲存的內容就變了在這之前,我們先把連結時的內容儲存一下,做一個對比

執行程式,在scanf處下斷點

可以發現,此時scanf@plt表變了,檢視got[4]裡內容

依然是push 0x1所在地址繼續除錯,直到這裡,got[4]地址被修改

此時想問了,這是哪裡?


然後就是got[2]中call<_dl_fixup>從而修改got[3]中的地址;

那麼問題就來了,剛才got[2]處不是0嗎,怎麼現在又是這個(_dl_runtime_resolve)?這就是執行時重定位。

其實got表的前三項是:

got[0]:address of .dynamic section 也就是本ELF動態段(.dynamic段)的裝載地址

got[1]:address of link_map object( 編譯時填充0)也就是本ELF的link_map資料結構描述符地址,作用:link_map結構,結合.rel.plt段的偏移量,才能真正找到該elf的.rel.plt表項。

got[2]:address of _dl_runtime_resolve function (編譯時填充為0) 也就是_dl_runtime_resolve函式的地址,來得到真正的函式地址,回寫到對應的got表位置中。那麼此刻,got表怎麼知道scanf函式的真實地址?這個問題已經解決了。我們可以看一下其中的裝載過程:

說到這個,可以看到在_dl_runtimw_resolve之前和之後,會將真正的函式地址,也就是glibc執行庫中的函式的地址,回寫到程式碼段,就是got[n](n>=3)中。

也就是說在函式第一次呼叫時,才通過聯結器動態解析並載入到.got.plt中,而這個過程稱之為延時載入或者惰性載入

到這裡,也要接近尾聲了,當第二次呼叫同一個函式的時候,就不會與第一次一樣那麼麻煩了,因為got[n]中已經有了真實地址,直接jmp該地址即可。

0x04 尾記

只是個人的見解,如有錯誤,希望各位大佬指出。

關聯文章

棧溢位漏洞原理詳解與利用

相關實驗--通過write實現資訊洩漏(介紹資訊洩露、GOT、PLT等相關概念,著重講解資訊洩露在緩衝區溢位中的重要作用。)

合天智匯:合天網路靶場、網安實戰虛擬環境