感謝各位作者的分享精神
事實上,直到第一次呼叫這個函式,都並不知道這個函式的位址,這個功能叫做延遲繫結(lazy bind)
因為程式的分支很多,並不是所有的分支都能跑到,比如異常處理,異常處理分支中的動態鏈結庫裡面的函式也許永遠都跑不到
所以,一上來就解析所有出現過的動態庫裡面的函式時個浪費的辦法,降低效能也沒有必要
got概述
plt表概述
今天以ret2libc 這個檔案作為例子分析
看到 write@plt,為什麼後面加了@plt,因為這個是plt表中的資料的位址
@plt函式是編譯系統自己加的
這裡我們在 write@plt 處下斷點
r執行這裡是第一次呼叫 write函式
我們 si 跟進
發現有三行**,jmp、push、jmp,我們要將這3條指令理解清楚
第一行**是通過plt表跳轉到got表
我們看一下要跳到的位址
發現要跳到下一步的push
這裡也說一下,在呼叫乙個函式的時候有兩種方法,乙個是通過plt表呼叫,乙個則是通過got表呼叫,因為plt表最終也是跳轉到got表,got表中則是乙個函式真正的位址,需要注意的是,在乙個函式執行第一次之前,got表中的資料為@plt函式中下一條指令的位址
push 0x10 //將資料壓到棧上,作為後面函式的引數
這裡的push 0x10,是壓入乙個引數入棧,壓入的引數給哪個函式用呢,是給_dl_runtime_resolve這個函式,這個引數就相當於函式的id,告訴_dl_runtime_resolve要去找哪乙個函式的位址
jmp 0x80482f0 //跳轉到函式
這裡跳轉到的位址其實是plt[0],我們來檢視一下這個位址,如下圖
發現有乙個跳轉,這個跳轉是調到got表中
我們可以使用如下命令來檢視一下got表
我們一路n下一步
發現將要跳到真正的write函式中去了,這裡留意一下write函式的真實位址,會和下面做比較
我們將write函式執行完
write函式第一次執行完了
我們此時,再來檢視一下write函式
通過disass main再來看一眼write@plt的位址
通過x命令檢視,發現又來到jmp、push、jmp這個地方了
這個時候再來檢視第乙個jmp跳到的位址
請和上上圖的write函式位址做比較,發現是一致的
所以在第一次執行write@plt之後,write函式的真實位址就會放到第乙個jmp裡面
在第二次執行時,就會直接跳轉過去,也就能初步理解延遲繫結機制
當第一次呼叫函式時,如下圖
第2次,則直接從plt表到got表,得到真實位址完成呼叫
好了,這節就到這裡了
加油繼續
pwn基礎學習日誌 七
小結 1.棧溢位 2.堆溢位 3.整數溢位漏洞 4.格式化字串漏洞 棧溢位通過如scanf strcpy read等危險的輸入函式存在的漏洞使輸入資料對棧空間內容進行覆蓋導致溢位。堆溢位通過向動態申請獲得的堆空間內寫入超過堆空間的資料導致下乙個堆的堆頭資訊被破壞 即空閒堆鍊錶指標被覆蓋 當使用到該指...
漏洞利用與滲透測試基礎(PWN基礎知識)
上面兩張圖是linux下的。ollydbg是乙個windows下用來反彙編以及動態除錯的工具,這裡我使用的吾愛破解版的ollydbg。我們可以看到介面有四大塊,載入可執行檔案後得到以下介面 左上角 反彙編 左下角 記憶體空間 右上角 暫存器 右下角 棧 ollydbg比較好用的幾個功能有 在反彙編視...
Go 15 Go 運算子基本使用
運算子是一種特殊的符號,用以表示資料的運算,賦值和比較等 算術運算子 主要對數值型別的變數進行運算 正號 負號 加減乘除 取模 取餘 自增 自減 除法 fmt.println 10 4 結果 2 解釋 都是整數,那麼除后,去掉小數部分,保留整數部分 如果希望保留小數部分,則需要又浮點數參與運算 va...