如果我知道他的CPU體系結構,可以將圖像中嵌入的指令發送給目標嗎?
如果我知道他的CPU體系結構,可以將圖像中嵌入的指令發送給目標嗎?
其他答案給出了很好的技術解釋,但讓我作一個類比:
>請把您的信用卡號發送到scam@example.com
您讀過嗎?
您讀過嗎?
對於您的CPU也是一樣。讀取內容與執行內容不同。
CPU指令在 opcodes中給出,您說對了,這些指令就像圖像一樣存在於內存中。但是,它們生活在概念上不同的內存“區域”中。
例如,您可以想像一個操作碼“讀取”(0x01),它從stdin讀取一個字節的輸入並將其放在某個地方,以及另一個操作數“ add”(0x02),將兩個字節相加。一些操作碼可以帶有參數,因此我們將為示例操作碼提供一些參數:“讀取”操作碼採用一個操作數來存儲其讀取的字節,而“加”操作碼則採用三個操作數:兩個為其中讀取其輸入的操作數
0x01 a1 //將字節讀取到內存位置0xa10x01 a2 //將字節讀取到內存位置0xa20x02 a1 a2 a3 //讀取字節在位置0xa1和0xa2處進行添加,//然後將結果寫入位置0xa3
這是許多指令工作方式的典型代表:大多數指令只對內存中的數據進行操作,其中一些將來自外部世界的新數據(從本例中的讀取stdin或文件或網絡接口的讀取)放入內存中。
這些指令和數據的確是正確的它們的操作都在內存中,程序只會運行指令。確保這一切是CPU,OS和程序的工作。當它們失敗時,實際上您可以將數據加載到執行空間中,這是一個嚴重的安全性錯誤。 緩衝區溢出可能是此類錯誤的最著名例子。但是除了這些類型的錯誤之外,您基本上可以將數據空間和執行空間視為單獨的CPU塊。
在玩具計算機中,使用上面的示例,內存可能看起來像:
(loc)|初始|在op 1之後|在op 2之後|在op 3之後| 0x00 | * 01 a1 | 01 a1 | 01 a1 | 01 a1 | 0x02 | 01 a2 | * 01 a2 | 01 a2 | 01 a2 |
0x04 | 02 a1 a2 a3 | 02 a1 a2 a3 | * 02 a1 a2 a3 | 02 a1 a2 a3 | 0x08 | 99 | 99 | 99 | * 99 | ... 0xa1 | 00 | 03 | 03 | 03 | 0xa2 | 00 | 00 | 04 | 04 | 0xa3 | 00 | 00 | 00 | 07 |
在該示例中,星號( *
)指向將要執行的下一個操作碼。最左邊的列指定該行的起始存儲位置。因此,例如,第二行向我們顯示了兩個字節的內存(值分別為 01
和 a2
)在位置0x02(在左側列中)和0x03。 / p>
(請注意,這都是一個很大的簡化。例如,在一台真實的計算機中,內存可以交錯-您將不會只有一條指令和其他所有內容。
請注意,在運行程序時,區域0xa1-0xa3中的內存發生了變化,但區域0x00-0x08中的內存卻沒有變化。 0x00-0x08中的數據是我們程序的可執行文件,而0xa1-0xa3區域中的內存則是程序用於進行數字運算的內存。
所以回到您的示例:jpeg中的數據會被操作碼加載到內存中,並會被操作碼操縱,但不會被加載到內存中相同的區域。在上面的示例中,兩個值0x03和0x04從未在操作碼區域中存在,這是CPU執行的操作。它們僅在操作碼讀取和寫入的區域中。除非您發現了一個錯誤(例如緩衝區溢出),該錯誤使您可以將數據寫入該操作碼空間,否則您的指令將不會執行。它們只是程序執行所操縱的數據。
可以發送給他們嗎?當然是。只需組裝它們並將它們粘貼在圖像文件中的某個位置即可。
目標是否將執行它們?不,不是這樣,除非您已經控制了目標(並可以在其中放置程序來讀取和執行它們),或者您在圖像查看器中發現了一些漏洞,並將圖像加載到其中。
如果目標使用2005年8月之前的Internet Explorer版本,則可以查看JPG。或者,如果他們打算在Windows 98的Windows Media Player中打開PNG,而未安裝安全更新。依此類推。
有很多舊的軟件曾經存在錯誤,如果您製作了一個圖像文件,其中圖像文件的第一部分對於像素的大小和位置大為撒謊,文件中的數據,軟件可能會做錯什麼,並意外地跳轉到錯誤地址的代碼,或者在應將程序代碼放置在文件中的位置從文件中寫入數據。我記得這些黑客之一涉及一個文件,該文件的標題聲稱圖像的大小為負。您可能無法使用Internet Explorer或Edge的最新版本執行此操作,因為現在每個人都知道該問題,並且Microsoft盡了最大的努力來解決此問題。
當今的操作系統已採取了一些保護措施。如果您發現使用這種方法來破解程序的新方法,則很難(但並非完全不可能)實現任何真正糟糕的事情。可以設置存儲區域,使其無法執行。程序具有單獨的虛擬地址空間,因此它們不會意外訪問彼此的內存。某些OS組件已加載到不可預測的內存位置,因此惡意代碼很難找到並使用它們。
不。圖像文件(例如JPEG文件)不執行代碼,它們只是呈現和顯示。執行任何指令。
要使文件運行代碼,該文件必須是可執行文件,或者由讀取該文件的其他程序運行,然後執行該文件中的命令。
在這種情況下,圖像可能導致執行代碼的罕見情況是,如果軟件中存在錯誤,則該錯誤會根據文件來生成圖像。過去曾發生過這種情況,但這種情況極為罕見。出於所有實際目的,圖像不能運行指令。
對於PDF,Adobe Flash等當然不是這種情況。
如果您還知道哪個軟件堆棧會觸及接收方的圖像,並且如果該軟件堆棧中存在未解決的安全漏洞,則可以。
僅將指令放在JPEG文件中就沒有任何作用。
但是,如果有一種已知的方法可以使某種格式正確的JPEG閱讀器實現在格式錯誤的JPEG文件上崩潰它將從不屬於該數據的映像文件中復制數據(例如,在包含程序控制流信息(如函數指針或返回地址)的變量之上),並且操作系統或硬件級別的對策(例如DEP)不會停止從發生,那是一個現實的機會。此類漏洞已存在於(並確實存在於傳統的)現實實現中。
簡短版本為否,因為計算機(SHOULD)知道數據和指令之間的區別。您應該使用JPEG進行的最糟糕的處理是諸如zip炸彈之類的事情,或者使某些JPEG解壓縮例程崩潰的事情。加載&並顯示JPEG的程序將不會嘗試運行文件中的任何數據,而僅對其進行讀取和處理-如果它意外命中了一些非jpeg數據,它將停止或崩潰,或者僅顯示但是,有時(我在看著你,微軟)人們嘗試編寫有用的軟件,這些軟件可能由於(例如)嘗試自動加載&顯示電子郵件附件而容易受到攻擊。 ,創建可以包含腳本/宏等的文檔格式,而這正是惡意文件可能會造成損壞的地方。
經典的示例(目前希望該方法已失效/處於防御狀態)是稱為的電子郵件附件像 .jpg.exe
之類的文件實際上是可執行文件,Windows會視其為可執行文件,但是因為Windows隱藏了擴展名(隱藏了最後一個.exe部分),參見 file.jpg
並單擊它,使操作系統運行它。
這是讀書和表演的區別。 ut這本書的內容-如果該書說“去打一個人”,您就不會這樣做,因為即使您的大腦正在處理數據,書中的單詞(數據)也無法控制您的大腦。 / p>