2017-02-28 75 views
0

我有一個進程正在調用sleep(),我想覆蓋sleep()的返回地址,所以當它返回時它會執行我的代碼。進行覆蓋的過程在沒有保護或隔離的情況下運行。那存儲的返回地址在哪裏?我怎樣才能用asm來改變它呢?我將如何覆蓋內核函數的返回地址?

+0

'存儲的返回地址在哪裏 - 像往常一樣在棧上。問題不是如何覆蓋它,而是如何找到它的位置以及如何到達那裏(操作系統不會讓你訪問你的內存)。 – Anty

+0

如果您使用優化編譯並且您的「睡眠」函數被內聯了,會發生什麼? –

回答

0

您不能在x86架構中從用戶模式覆蓋內核函數的返回地址 - 處理器在執行使用它的特權間控制傳輸時切換堆棧。
而且根據mechanism used to enter the kernel-mode,地址甚至可能不在堆棧中。

像往常一樣,所有的細節在Intel Software Developer's Manual 3


也就是說,大多數的用戶模式功能是該系統圍繞包裝要求 - 讓他們都沒有,還沒有,內核函數,因此你可以「簡單」毒堆棧上的返回地址轉向控制流程如您所願(àla Return Oriented Programming)。
承認您的掛鉤代碼有機會在掛鉤函數返回之前執行。

但是過程是分離的,我不知道你是什麼意思與

做覆寫下一沒有保護或單獨運行的過程。

但是無論如何,您都需要在掛鉤過程中擁有有效載荷。

根據您如何在第一時間放置有效負載,將目標函數的調用更改爲調用原始函數以及執行有效負載的過程的調用可能更容易(取而代之處理類似堆棧的瞬態結構)。
該行的底部,如果您打算修補可執行文件以在其代碼部分中放置有效內容,請修改該調用。

如果你的未說明的意圖是劫持一個導入/動態鏈接的函數,那麼它本身就會調用一個特定的問題,並提供比你在這裏提供的更好的上下文。

相關問題