題:
如果我知道目標的CPU架構,是否可以發送嵌入在映像中的指令?
Faminha102
2018-10-29 06:47:57 UTC
view on stackexchange narkive permalink

如果我知道他的CPU體系結構,可以將圖像中嵌入的指令發送給目標嗎?

[是否可以將惡意軟件附加到圖像?](https://security.stackexchange.com/questions/55061/can-malware-be-attached-to-an-image)的可能重複項
你當然可以。但是不會執行它們。實際上,大多數字節都是有效的CPU指令。
當然,只要在紙上寫然後拍照... :)
請注意,有些圖像格式明確地依賴於“任意代碼執行”(主要是從舊時代起,兼容性和節省內存和CPU比保護圖像更為重要)。最值得注意的可能是WMF,該功能在原始實現中非常合理且安全,但是當將代碼從Windows 3.0(16位)移植到Windows NT(32位,並且僅在x86上)時,安全性喪失了。。因此,這是例如Windows 98(台式機)比Windows NT(服務器/專業版)更安全:)
[漏洞](https://docs.microsoft.com/zh-cn/security-updates/vulnerabilityresearchadvisories/2012/msvr12-004)是否導致提出此問題?
當然可以,並且也可以使用任何其他形式的媒體。因此,您最好相信自己的媒體查看器沒有錯誤或意外的“功能”。
七 答案:
Antzi
2018-10-29 13:42:48 UTC
view on stackexchange narkive permalink

其他答案給出了很好的技術解釋,但讓我作一個類比:

請把您的信用卡號發送到scam@example.com

>
  • 您讀過嗎?

  • 您讀過嗎?

  • 對於您的CPU也是一樣。讀取內容與執行內容不同。

    但這並不是最好的類比,因為作為人類,我們可以停下來決定某事是否是個好主意,但是計算機卻不能。在啟動之前,計算機必須“決定”。
    +1,嘗試類推。僅僅因為我*閱讀*了一套說明,並不意味著我實際上*做了*它們。
    這是@CaptainMan的一個很好的比喻。如果幾年後“ scam@scammer.org”沒有收到此帖子的信用卡號b / c,這不會令我感到驚訝。
    下一步是什麼?從我寄出郵件到現在已經快8個小時了,但我仍然沒有回音。
    @emory您真的認為能夠熟練閱讀英語以找到該頁並閱讀該句子的人將無法理解所張貼的上下文,以至於他們誤以為必須執行的指示嗎?
    @Adonalsium是的,我認為,鑑於足夠的讀者,這是不可避免的。實際上,我們被認為是已經發生了。
    -1
    您被告知將書寫內容從一張紙複製到另一張紙上。紙上寫著“請發送您的信用卡號...”。您完全有能力執行這些指令(特別是複制它們),而無需執行它們。就像報紙上說“ erwcwmexrnwem,cwtuvklewer”一樣。
    為了完成類比,假設詐騙者設法將指令嵌入似乎是從銀行發送的信件中。現在,該消息位於標記為“指令”的區域內,並將被執行。
    @emory-顯然是“ scammer.org”正在出售,因此您可以購買該域名,然後拭目以待。:)
    @Jules這是一個騙局:)
    @Adonalsium從角度來看,進行尼日利亞騙局的人通常會*繼續*稱自己為尼日利亞的王子,即使該名稱是該騙局的代名詞。據信,這起到了過濾器的作用:只有最易受騙的人仍會回复尼日利亞王子。批量電子郵件很便宜,但是其餘的過程是由人來完成的。他們繼續使用這個綽號而不是“強而有力地”發展,這一事實表明,有足夠多的人為此騙局而值得。
    @CaptainMan我們無法避免發送電子郵件,因為我們停下來決定了這是否是個好主意。就像計算機可以根據上下文選擇使數據可讀或可執行一樣,我們也可以這樣做。我們在提供信息的上下文中而不是在必須遵循的順序的上下文中閱讀此騙局。
    @CortAmmon IIRC主要是老年癡呆症患者,他們信任像這樣的電子郵件...這使其顯得更加愚蠢。無論如何,這是一個信任問題,而不是閱讀理解問題。
    @forest是。因為我們了解這些說明將是您的防病毒工作,所以請不要誤入歧途。
    “每個人都站下來!我有槍的照片,我不怕使用它!”:-P
    一個更好的類比是“您想和我約會嗎?%§〜ÍŠ(扒手信用卡)”。
    這種類比是不准確的,因為電子郵件通常用於發送指令。CPU根本不將帶有操作碼的圖像視為一組指令。
    yshavit
    2018-10-29 11:28:01 UTC
    view on stackexchange narkive permalink

    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執行的操作。它們僅在操作碼讀取和寫入的區域中。除非您發現了一個錯誤(例如緩衝區溢出),該錯誤使您可以將數據寫入該操作碼空間,否則您的指令將不會執行。它們只是程​​序執行所操縱的數據。

    您的答案最多只能部分正確。除了簡化所有數據都必須駐留在“堆棧”上的假設外,錯誤的假設是無法在堆棧上操縱數據用於執行任意代碼。
    -1
    @Blackhawk:幾乎所有關於堆棧的信息都是錯誤的。這有點類似於[stack machine](https://en.wikipedia.org/wiki/Stack_machine)架構的運行方式,但是大多數現代計算機不使用堆棧計算機架構,甚至堆棧計算機都將堆棧用作臨時存放指令輸入和輸出的場所,而不是存放所有數據的地方。(現代計算機體系結構中使用的調用堆棧是另一回事,並且該堆棧也無法像此答案所描述的那樣工作。)
    同樣,緩衝區溢出通常會覆蓋返回地址等內容,而不是可執行內存。
    雖然“除非您利用錯誤,否則不正確”部分是正確的,但此答案涉及很多不必要的和“錯誤的”細節,這對於沒有經驗的讀者來說似乎更有用,但是實際上,答案比簡短但正確的答案要差沒有被接受的答案。
    -1
    (儘管如此,我確實省略了有關寄存器的討論,但我認為它們不會增加OP的要求。)
    馮·諾依曼會怎麼說?
    說“只有在IP寄存器更改為內存中數據的地址時才執行數據”,要比遍歷所有這些要簡單得多。
    @forest我認為,如果某人已經具有很多此類知識,那將主要可以使用。我試圖針對某個確實了解程序駐留在內存中的人,而圖像數據也是如此,但是不了解它們如何保持區別。我個人認為舉一個具體的簡化示例很有幫助,儘管我絕對理解其他人認為它不起作用。:)
    @Blackhawk那是“權威證明”,以上是“對孩子的謊言”。謊言告訴孩子有價值。
    如果要這樣做,應該有一個按鈕可以將其移至聊天狀態。
    @yshavit我認為您應該刪除以下語句:“的確,它們所操作的指令和數據確實都在內存中,但是它們都在內存的不同部分。”因為它充其量是一種誤導,而最壞的情況是純屬錯誤。
    -1
    @yshavit更好嗎?在不了解機器代碼執行方式的情況下很難解釋這個概念。我要說的很簡潔:“只有當正在運行的進程以這種方式解釋數據時,數據才作為指令執行”。
    但是現代系統是馮·諾依曼(Von Neumann)體系結構,而不是哈佛體系結構,因此它只是一個執行位,它確定頁面是否可執行,而不是頁面在內存中的存放位置(忽略x86 CPU在內部是哈佛的事實,即單獨使用L1d和L1i的情況)緩存)。
    @forest: x86具有一致的i緩存(與許多其他體系結構不同,在可靠地執行新存儲的機器代碼字節之前,這些體系結構需要顯式的刷新/同步insns),因此從軟件PoV看,現代的x86是純馮·諾依曼。[使用自修改代碼在x86上觀察過時的指令提取](https://stackoverflow.com/q/17395557)。順便說一句,用於統一地址空間的拆分L1高速緩存通常被描述為幾乎是馮·諾依曼類型的Modified Harvard體系結構。https://zh.wikipedia.org/wiki/Modified_Harvard_architecture#Split-cache_(or_almost-von-Neumann)_architecture
    @PeterCordes是的,我知道這是一種改良的哈佛體系結構,但是對ISA來說是不可見的。
    @forest:是的,在ISA中不可見,這也是我所說的。:)(從技術上講,在紙上x86可以運行過時的指令,直到執行jmp /分支,但實際的硬件實現選擇比紙ISA更強,因為實際上這要比*嚴格*嚴格如規範而絕不弱這就是安迪·格萊夫(Andy Glew)在鏈接的“問答”上的答案(安迪是英特爾P6 uarch的架構師之一)。哈佛隱含著單獨的地址空間。
    Joseph Sible-Reinstate Monica
    2018-10-29 06:51:35 UTC
    view on stackexchange narkive permalink

    可以發送給他們嗎?當然是。只需組裝它們並將它們粘貼在圖像文件中的某個位置即可。

    目標是否將執行它們?不,不是這樣,除非您已經控制了目標(並可以在其中放置程序來讀取和執行它們),或者您在圖像查看器中發現了一些漏洞,並將圖像加載到其中。

    CPU不應僅通過打開圖像來執行指令嗎?
    不,為什麼呢?
    據我了解,因為CPU必須處理該信息。
    處理數據字節與執行那些字節不同。一個並不暗示另一個。
    難道不是所有字節都在最後嗎?
    是的,但是某些字節被執行,而某些字節僅被視為數據。
    我知道了,這樣我便可以理解:誰對此負責?將jpg文件視為數據而不是可執行文件的os?
    @Faminha102如果您在外面散步時偶然發現一張紙上有一些指示,那麼您會遵循這些指示嗎?可能不會。您可能仍會閱讀並理解這些說明,但是您不會對它們採取任何行動,因為您知道它們並非針對您的。類似的想法在這裡適用。
    -1
    @Faminha102是,文件是否被確定為可執行文件完全取決於操作系統。文件由程序解釋,您可以使用多種方式解釋文件。一個常見的示例是可以作為程序運行或作為ZIP文件打開的安裝程序。
    一些字節被提供給計算機以執行。其他不是。就這麼簡單。如果將字節放入可執行文件中並說服計算機用戶運行它,則OS會將這些字節傳遞給CPU以執行,然後您便離開了。如果這樣做是為了處理JPEG圖像,那麼這是非常錯誤的。
    這裡的誤解可能來自觀察到雙擊圖像*顯示*(“啟動”)圖像,就像雙擊可執行文件會啟動可執行文件一樣。
    實際上,當雙擊圖像時,操作系統將根據文件的擴展名運行與該特定文件類型相關聯的可執行文件,並將該路徑作為參數傳遞給該文件。。
    @Faminha102如果有幫助,圖像字節不會簡單地通過CPU饋送。如果給CPU提供了指令集或字節來指示它執行某項操作,它將逐個讀取這些指令字節並按照指令執行。對於加載映像,它可能首先將映像的每個字節從磁盤複製到內存。圖像字節不會通過CPU。將指示磁盤將每個圖像字節加載到總線上,然後將指示存儲器從總線加載字節。當然,這是一個簡單的簡化,但是希望它可以幫助您理解總體思路。
    它當然不應該,但是有(漏洞?)[漏洞](https://docs.microsoft.com/zh-cn/security-updates/vulnerabilityresearchadvisories/2012/msvr12-004)被執行。但是,為什麼在地球上以一種可能導致這種情況的方式編寫圖像庫,但這超出了我的範圍。
    Robyn
    2018-10-29 15:50:02 UTC
    view on stackexchange narkive permalink

    如果目標使用2005年8月之前的Internet Explorer版本,則可以查看JPG。或者,如果他們打算在Windows 98的Windows Media Player中打開PNG,而未安裝安全更新。依此類推。

    有很多舊的軟件曾經存在錯誤,如果您製作了一個圖像文件,其中圖像文件的第一部分對於像素的大小和位置大為撒謊,文件中的數據,軟件可能會做錯什麼,並意外地跳轉到錯誤地址的代碼,或者在應將程序代碼放置在文件中的位置從文件中寫入數據。我記得這些黑客之一涉及一個文件,該文件的標題聲稱圖像的大小為負。您可能無法使用Internet Explorer或Edge的最新版本執行此操作,因為現在每個人都知道該問題,並且Microsoft盡了最大的努力來解決此問題。

    當今的操作系統已採取了一些保護措施。如果您發現使用這種方法來破解程序的新方法,則很難(但並非完全不可能)實現任何真正糟糕的事情。可以設置存儲區域,使其無法執行。程序具有單獨的虛擬地址空間,因此它們不會意外訪問彼此的內存。某些OS組件已加載到不可預測的內存位置,因此惡意代碼很難找到並使用它們。

    更多詳細信息:https://security.stackexchange.com/questions/97856/can-simply-decompressing-a-jpeg-image-trigger-an-exploit
    著名的德國博主[Felix von Leitner](https://blog.fefe.de/)經常強調說,奇怪的是,*病毒掃描程序*暴露出巨大的攻擊面,因為它們必須能夠在以最大權限運行的同時打開所有文件格式。因此,您甚至不必打開JPEG。如果您的防病毒程序嘗試在後台掃描它,可能就足夠了。
    究竟。JPEG最有可能感染了計算機。一次Google搜索* jpeg惡意軟件*返回了[此網站對其進行解釋](https://www.bullguard.com/blog/2018/01/jpeg-files-and-malware)。
    某些軟件中的漏洞至少在2012年就存在:https://docs.microsoft.com/zh-cn/security-updates/vulnerabilityresearchadvisories/2012/msvr12-004
    Daisetsu
    2018-10-29 06:55:30 UTC
    view on stackexchange narkive permalink

    不。圖像文件(例如JPEG文件)不執行代碼,它們只是呈現和顯示。執行任何指令。

    要使文件運行代碼,該文件必須是可執行文件,或者由讀取該文件的其他程序運行,然後執行該文件中的命令。

    在這種情況下,圖像可能導致執行代碼的罕見情況是,如果軟件中存在錯誤,則該錯誤會根據文件來生成圖像。過去曾發生過這種情況,但這種情況極為罕見。出於所有實際目的,圖像不能運行指令。

    對於PDF,Adobe Flash等當然不是這種情況。

    有趣。因此,使用PDF可以,這就是您的意思?
    PDF具有更多功能,它們可以交互,加載外部資源,嵌入其他文件等。但是,它們不像Word / Execl文件那樣危險。
    您能詳細說明一下嗎?
    詳細說明什麼?特洛伊木馬式攻擊依賴於看起來無辜的文件,該文件包含惡意負載(單詞宏,可執行文件,javascript),或者由易受攻擊的解析器讀取。第二種情況很少見,並且引起了很多關注,因為它會影響很多人。您可能會熟悉一個示例,即Flash。Flash會不斷進行安全更新,因為它會盡力而為,因此有很多方法可以製作文件,從而導致(有時)執行任意代碼。
    @Faminha102 PDF不同,因為現代PDF文件格式旨在執行嵌入式javascript(類似於HTML文件的操作)。但是用戶必須打開PDF文件
    _“ JPEG文件之類的圖像文件無法執行代碼” _:我發現這有點不准確。即使大多數可執行文件也不執行代碼,它們正在被執行。
    @phresnel是正確的。您可能製作了一個文件,當以JPEG圖像打開時,顯示的是(醜陋的)圖片,而以代碼執行時,則具有惡意。
    為了擴展@phresnel的註釋,* no *文件執行代碼,程序執行代碼。操作系統具有與文件擴展名關聯的程序。當您雙擊一個文件時,與該文件擴展名關聯的程序將運行,然後該程序將打開該文件。如果使用僅渲染圖像的程序打開文件,則無論文件內容如何,都不會運行該文件中的任何代碼。
    @Captian Man,要使文件直接執行(不被另一個解釋其指令的進程調用),程序必須是二進制可執行文件(對於Linux是ELF二進製文件,對於Windows是PE。您不能簡單地獲取二進製文件並創建有效的JPEG文件。JPEG和PE / ELF的標題不對齊。
    @Daisetsu:但是,如果您有一個有趣的程序“ JpegExecuter”,該程序將JPEG加載到內存中並將顏色解釋為指令,則可以執行該文件。就像我可以在Linux機器上以.COM或.EXE格式運行Windows二進製文件一樣,給出了一個名為Wine的有趣程序。或.NET。沒有主機就無法執行。實際上,這種討論可能會變得非常多。“直接執行文件”實際上是什麼意思?即使是(可能是)最原始的二進制格式.COM,也必須先加載,然後再由CPU解釋並消化為微代碼。
    順便說一句,http://www.dangermouse.net/esoteric/piet/samples.html
    任何人都可以編寫@phresnel的程序來以不遵循格式(JPEG)標準的方式來解釋文件。但這不是現實的情況。問題是關於普通的JPEG文件,這些文件通常是由普通的圖形程序渲染的。
    是的,但這並不能使“ JPEG文件不執行代碼”比“ EXE文件不執行代碼”更準確。
    rackandboneman
    2018-10-30 17:39:35 UTC
    view on stackexchange narkive permalink

    如果您還知道哪個軟件堆棧會觸及接收方的圖像,並且如果該軟件堆棧中存在未解決的安全漏洞,則可以。

    僅將指令放在JPEG文件中就沒有任何作用。

    但是,如果有一種已知的方法可以使某種格式正確的JPEG閱讀器實現在格式錯誤的JPEG文件上崩潰它將從不屬於該數據的映像文件中復制數據(例如,在包含程序控制流信息(如函數指針或返回地址)的變量之上),並且操作系統或硬件級別的對策(例如DEP)不會停止從發生,那是一個現實的機會。此類漏洞已存在於(並確實存在於傳統的)現實實現中。

    John U
    2018-11-01 19:48:36 UTC
    view on stackexchange narkive permalink

    簡短版本為否,因為計算機(SHOULD)知道數據和指令之間的區別。您應該使用JPEG進行的最糟糕的處理是諸如zip炸彈之類的事情,或者使某些JPEG解壓縮例程崩潰的事情。加載&並顯示JPEG的程序將不會嘗試運行文件中的任何數據,而僅對其進行讀取和處理-如果它意外命中了一些非jpeg數據,它將停止或崩潰,或者僅顯示但是,有時(我在看著你,微軟)人們嘗試編寫有用的軟件,這些軟件可能由於(例如)嘗試自動加載&顯示電子郵件附件而容易受到攻擊。 ,創建可以包含腳本/宏等的文檔格式,而這正是惡意文件可能會造成損壞的地方。

    經典的示例(目前希望該方法已失效/處於防御狀態)是稱為的電子郵件附件像 .jpg.exe 之類的文件實際上是可執行文件,Windows會視其為可執行文件,但是因為Windows隱藏了擴展名(隱藏了最後一個.exe部分),參見 file.jpg 並單擊它,使操作系統運行它。

    這是讀書和表演的區別。 ut這本書的內容-如果該書說“去打一個人”,您就不會這樣做,因為即使您的大腦正在處理數據,書中的單詞(數據)也無法控制您的大腦。 / p>



    該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
    Loading...