前言
在 Linux 程式的動態連結過程中,Lazy Binding 和 GOT 扮演著重要角色。要玩 GOT hijacking,先搞懂這兩個機制的原理,才有辦法往下動手
Lazy binding
Lazy binding 是dynamic linking的一種機制,dynamic linking的程式會在執行的時候才把library map到memory來用
- 有時候一個程式可能使用到很多個libc function,程式執行到結束,不一定每一個function都會被call到
- 有時候可能會有一直都沒被用到的libc fnction
- Lazy binding的機制就是程式第一次呼叫library function的時候,才會去尋找function的位置,並將其填入GOT表中,後面再呼叫此function的時候就從GOT table裡面獲取它的位置
GOT
GOT,全稱Global offset table,他是一個function pointer的array,舉一個例子
這個table裡面第一格裡面存了一個printf的library的function pointer,第二個存read,第三個存write之類,這樣就是一個array存著不同library function
- library的位置在載入的時候才決定,compiler在編譯的時候無法知道library function address
- GOT為儲存library function位置的指標陣列,而lazy binding的機制,一開始不會得知真實位置,而是先填入位於plt的code
怎麼看GOT table的offset?
objdump -R <binary>
