GOT表和PLT表知識詳解
我們用一個非常簡單的例子來講解,程式碼如下:
圖1
然後我們編譯
我們直接
圖3
我們可以觀察到
原因
為了更好的使用者體驗和記憶體
圖
其實在大家進入帶有
那問題來了,這個disas gets
圖
大家可以發現,這個函式只有三行程式碼,第一行跳轉,第二行壓棧,第三行又是跳轉,解釋:
第一行跳轉,它的作用是通過
jmp 指令跳轉到GOT 表GOT 表中的資料為0x400486 - 跳轉到指令地址為
0x400486 - 執行
push 0x3
#這個為在GOT 中的下標序號 - 在執行
jmp 0x400440
- 而
0x400440 為PLT[0] 的地址 PLT[0] 的指令會進入動態連結器的入口- 執行一個函式將真正的函式地址覆蓋到
GOT 表中
這裡我們要提幾個問題:
1.
2. 為什麼中間要進行
3. 壓入的序號為什麼為
解決問題
問題1
看下圖:
圖
我們嘗試著檢視disas gets
看程式碼的時候是從x /5i 0x400440
檢視
圖
我們看到了後面的#之後又一個objdump -R ./a.out
檢視一個程式的
圖
這裡都是些