簡體   English   中英

使用緩沖區溢出漏洞運行自己的代碼

[英]Running own code with a buffer overflow exploit

我正在嘗試了解緩沖區溢出漏洞利用,更具體地說,是如何將其用於運行自己的代碼-例如,通過啟動我們自己的惡意應用程序或任何類似程序。

盡管我確實使用gets()函數理解了緩沖區溢出利用的思想(用足夠長的字符串覆蓋返回地址,然后跳轉到所述地址),但在實際應用中,我仍在努力理解一些事情,那些是:

  • 我是否將自己的代碼放在返回地址后面的字符串中? 如果是這樣,我怎么知道要跳轉的地址? 如果沒有,我應該跳到哪里,實際的代碼在哪里?

  • 運行代碼的實際有效載荷是我自己正在運行的軟件,而另一個程序只是進入了該有效載荷,還是有效載荷中提供了所有指令? 更具體地說,緩沖區溢出漏洞利用實現實際上是什么樣的?

  • 地址(或任何指令)包含0怎么辦? gets()函數在讀取為0時停止讀取,那么如何解決這個問題呢?

作為一項家庭作業,我試圖利用一個非常簡單的程序,該程序只要求使用gets()(關閉ASLR)來輸入,然后打印它。 雖然我可以找到調用該函數和返回的函數的內存地址,但我仍然無法弄清楚如何真正實現該漏洞利用。

您了解更改寄信人地址如何使您跳到任意位置。

但是,當您正確識別了代碼后,您將不知道要在哪里加載要執行的代碼。 您只需將其復制到本地緩沖區(通常在堆棧中的某些位置)。

但是有些東西總是指向這個堆棧,它是堆棧指針寄存器。 (假設x64將會是%rsp )。

假設您的自定義代碼在堆棧的頂部。 (它可以偏移,但是也可以類似地管理)。

現在,我們需要一條指令:1.允許我們跳轉到esp 2.位於固定地址。

因此,大多數二進制文件都使用某種共享庫。 在Windows上,您具有kernel32.dll 在加載該庫的所有程序中,它始終映射在同一地址。 因此,您知道該庫中每條指令的確切位置。

您要做的就是反匯編一個這樣的庫,然后找到一條指令,例如

jmp *%rsp // or a sequence of instructions that lets you jump to an offset

然后,該指令的地址就是您應該將返回地址放在的地址。 函數將返回,然后跳轉到堆棧(當然,您需要一個可執行的堆棧)。 然后它將執行您的任意代碼。

希望這可以消除有關如何運行漏洞利用程序的困惑。

要回答您的其他問題-

是的,您可以將代碼直接放在緩沖區中。 或者,如果您可以找到想要執行的確切代碼(同樣在共享庫中),則可以直接跳轉到該代碼。

是的, gets會停在\\n和0。但是通常您可以通過稍微改變一下指令以編寫完全不使用這些字節的代碼來逃脫現實。

您嘗試使用不同的指令並檢查匯編的字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM