[英]reverse engineering doubt
8048563: e8 0d 00 00 00 call 8048575 <exit@plt+0x141>
我試圖對二進制進行逆向工程以求有趣,然后在objdump輸出中看到了此調用。 看這行,我認為調用將是動態鏈接的退出函數。 但是, 8048575
似乎是該程序.text部分中的地址!
8048575: 83 ec 6c sub esp,0x6c
當程序調用共享庫中的函數時,它將調用過程鏈接表(PLT)中的地址。 最初,PLT包含一個對動態鏈接器的調用,該調用將動態查找功能地址,然后將PLT中的地址替換為其找到的地址。
這就是對IAT(導入地址表)條目的調用,以便它可以對稱為“ exit”的函數執行模塊間調用(實際上是跳轉),這可以避免遠端調用,並使動態鏈接更簡單。 至於“丟失”的序言,根本就不需要建立堆棧框架,事實上大多數功能完全不需要它,因此堆棧分配就是該序言,真正需要堆棧框架的唯一功能是“不信任”的匯編函數或對堆棧進行不可預測的更改的函數。
這實際上不是IAT / PLT調用,而是對同一文件中另一個函數的調用。 該文件可能已刪除其內部符號,並且objdump將所有地址顯示為地址+偏移量之前的最后定義的符號。 沒有內部符號,這將命中最后一個與plt鏈接的函數,因為plt部分位於文本之前。
因此,顯示的名稱只是虛假的,可以忽略。
分配堆棧空間是函數的序言,不是嗎? 您怎么知道這不是exit
功能的開始? .text很好,因為這是代碼所在的地方。 (請僅參考“程序列表表”。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.