題:
逆向工程可以繞過軟件密碼嗎?
T.Todua
2016-12-11 00:05:49 UTC
view on stackexchange narkive permalink

比方說,我在自己的操作系統(Windows或其他操作系統)中擁有Admin特權。安裝並執行軟件 XYZ 時,這意味著操作系統與 XYZ 之間存在通信,並且操作系統將執行並查看 XYZ 所做的一切。

這是我對密碼(例如.zip密碼)的看法:

enter image description here

是否可以更改軟件執行命令而不是其他命令的邏輯?如果是這樣,那麼什麼都無法防止破裂?

是的,但這是最簡單的RCE。只需在Debugger / Disassembler中打開程序並找到跳轉命令即可!觀看此https://www.youtube.com/watch?v=uydMlQlEiyc
對於大多數依賴加密算法的受密碼保護的資源(包括zip文件),您所描述的內容是不正確的,但是很大程度上取決於有多少種基於DRM的解決方案在運行。
基於DRM的解決方案的示例:PDF。
對於許多人為地限制功能的程序,這完全是可能的,但對於訪問“加密的數據”的程序則完全不可能。此處的密鑰是加密數據,例如受密碼保護的zip和pdf文件,在不知道用於解密的密碼的情況下,任何程序都無法讀取它們。
一些舊遊戲的保護類型是在手冊中鍵入一個特定的單詞,然後檢查該單詞是否正確。只需將“如果零跳變”更改為“非零跳變”(我記得,是73h到74h)。
TL; DR:可以通過反向來繞過所有的_software_保護機制。_ALL_不是“如果”,而是“何時”。就是說,我在一家公司工作,該公司使用硬件級數據陷阱來執行/信號線程,以便每當寫入內存中的特定字節時就處理密碼的兩半(這是與Intel兼容的功能)-花了兩年時間在有人弄清楚我們的密鑰如何存儲之前..但是..在發現算法後,它最終與代碼相反。
@ShaunWilson聽起來非常聰明,非常有效。對於負責調試的人(原始開發人員*和*黑客),這種“魔術”真是令人生氣,我真的感到抱歉。
最終,您所缺少的只是**對加密背後的數學的理解。**對於該主題的入門知識,我*強烈*推薦** [“數論”一章](https://ocw.mit.edu/課程/電氣工程與計算機科學/6-042j-mathematics-for-computer-science-fall-2010/readings/MIT6_042JF10_chap04.pdf)**來自MIT公開課件材料中的“計算機科學數學”課程。”到最後,您將實際使用鉛筆和紙來處理RSA算法。
(如果您不熟悉證明符號,請[從課程開始時開始] [https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2010 / readings /)。)
十一 答案:
Alexander O'Mara
2016-12-11 00:21:38 UTC
view on stackexchange narkive permalink

簡而言之,是的,您可以修改可執行文件,使用調試器等來更改正在執行的代碼的邏輯。

但是,這可能還不夠。

要使用“ .zip密碼”示例,受密碼保護的檔案庫使用密碼來導出加密密鑰。除非您提供正確的密碼,否則生成的密鑰將是錯誤的,即使將其修改為使用了錯誤的密鑰,也無法成功解密ZIP文件。

另一種情況可能涉及setuid可執行文件,以更高的特權運行。您可以在調試器下運行它,也可以將其複製到您的用戶帳戶中並進行更改,但是只要在用戶權限下運行它,就可以實現所有這些,從而消除了利用可能性。

相關-http://stegosploit.info/-基於提供的不同密碼可以是兩個不同的輸出。
kubanczyk
2016-12-11 01:51:13 UTC
view on stackexchange narkive permalink

您對.zip密碼的認識不正確。許多其他程序還使用了這種方法,即在程序甚至達到“好還是不好的密碼”決定之前,始終運行解密算法並獲得結果。訣竅在於,解密會在任何密碼上產生垃圾,只有一個好的密碼可以“神奇地”(或更確切地說-在數學上)計算出正確的數據。因此程序不知道什麼是好密碼。

您想要破解的“好還是不好”時刻只會檢查結果是否為垃圾。覆蓋它並沒有太大好處。

kevin
2016-12-12 17:20:11 UTC
view on stackexchange narkive permalink

由於尚無人提出與現實生活(與計算機無關)的示例,因此我請在這裡嘗試:

想像一下要登機。您需要登機牌,否則安全人員將無法通過您。如果您有權訪問系統並且可以修改系統(例如您是CEO),那麼可以繞過安全性嗎?是!您可以:

  • 刪除安全人員(刪除整個身份驗證組件)
  • 請這些人員讓所有人進入(刪除“如果乘客有有效的登機證” )
  • 如果有人出示特殊的登機牌(請添加新的驗證規則以允許偽造的憑單),請讓他們允許訪問

現在,另一種情況:一堆保險箱存儲在銀行中。要打開保險箱,您需要一個物理鑰匙才能打開鎖。

您能拉出前面的把戲嗎?是的,您可以,但無濟於事。站在那裡的安全人員並不像可以使用所有保險箱的人那樣-他沒有任何保險箱的鑰匙。您可以擊敗他,但他不僅僅擁有打開鎖所必需的東西(物理鑰匙)。

您可以嘗試選擇鎖(強行施加),但是這樣做會非常耗時(現代加密密鑰的數學計算表明,即使您擁有世界上所有的計算機都在為您解鎖,也需要數十億年的時間來解鎖)。這樣就可以了-在這種設計(數據加密)中,獲取存儲數據的唯一方法是使用密鑰,因此無法繞過密鑰。

Xiong Chiamiov
2016-12-11 00:38:22 UTC
view on stackexchange narkive permalink

當然,軟件可以執行您編寫的所有代碼。

作為一個簡單的示例,如果提供了一個檢查密碼的Python程序,則該軟件:

  password = raw_input('輸入密碼:')if password!='oh-so-secret':sys.exit(1)do_secure_thing() 

我可以很簡單地將其更改為不在乎密碼是什麼:

  password = raw_input('輸入您的密碼:')do_secure_thing() 

(在這種情況下,您也可以

對於二進制應用程序,必須先對它們進行反編譯,然後才能修改源代碼,但是有許多常見語言的反編譯器。

p>

這就是為什麼存在代碼簽名的原因。

現在,如果這不是您自己的系統,則您的選擇可能會受到限制。在大多數類Unix系統上,可執行文件通常以非root用戶的只讀和執行權限存儲。因此,如果您不是root用戶,則無法修改目標可執行文件。還有其他不太直接的方法可以嘗試,但是如果失敗了,那麼您正在尋找使用其他矢量的方法。

例如,鍵盤記錄器將記錄用戶輸入的密碼,使您可以重複使用它們

另一種不需要修改程序源的攻擊方法是修改動態庫加載路徑,以使程序使用您編寫的庫調用,而不是一個它期望。如果他們使用外部動態加載的庫進行密碼管理,並且該庫具有返回布爾值的 verify_password()函數,則可以編寫自己的 verify_password()始終返回true,然後將其加載。

將答案從“是”更改為“否”的真正區別是,如果密碼實際上不是密碼,而是加密密鑰。如果數據是加密的,那麼外部程序做什麼都沒關係-在解密算法得到正確的密鑰之前,數據仍然會加密。

通過執行以下操作可以使它更安全:`h ='$ 1 $ dikapmhs $ 4YIBUV3 / uTlSZ7dF1 / VWt /'`如果crypt(password,h)!= h:`則不再有純文本密碼來源。
@kasperd您的觀點在答案最後一段中提到的特殊情況下有效。但是,在其他情況下(例如,當攻擊者_能夠修改可執行文件_時),無論密碼是否以純文本格式存儲在源代碼/二進製文件中,受害者都無法倖免。
-1
儘管答案很好,但OP明確提到擁有管理員權限,您的答案更多地集中在故事的非管理員方面
@OlleKelderman在我回答時,[沒有提及管理員特權](https://security.stackexchange.com/revisions/144980/1)。
@XiongChiamiov哦,抱歉,在這種情況下您還沒說什麼
代碼簽名在這裡沒有用。使簽名檢查返回true是微不足道的。
簽名檢查可以用硬件或固件來實現,但是我同意,擁有管理員特權,您擁有計算機。
schroeder
2016-12-11 00:36:51 UTC
view on stackexchange narkive permalink

假設您有一個將數據存儲在文本文件(或小型數據庫)中的應用程序,但是要從該應用程序訪問文件 ,您需要輸入密碼或使用特殊過程。您只需使用操作系統即可從文件目錄中打開文本文件(或db)(無需反向工程)。在過去的程序(尤其是遊戲)中,這種情況經常發生。

這就是為什麼希望安全的應用會採取措施保護數據免受OS本身侵害的原因。像加密數據或混淆數據使其難以使用。

讓我為您解決這個問題:“這就是希望*變得晦澀*的應用程序採取措施保護數據免受OS本身破壞的原因。”應用程序無法採取任何措施來保護自己免受操作系統的侵害,該操作系統具有調試器特權,並且可以暫停和轉儲內存中的解密數據。
@LieRyan進行編輯!
正如我所描述的,@LieRyan雖然我同意安全性和模糊性之間的區別,但我不確定這種情況下的區別是否值得糾正。我用“希望”來修飾該語句,並將混淆處理描述為一種技術。這些技術也用於內存中。
VL-80
2016-12-12 00:44:28 UTC
view on stackexchange narkive permalink

這取決於軟件 XYZ 如何使用密碼來產生所需的操作以及它使用的數據類型。

如果我們看一下 XYZ 程序為:

  1. 要求用戶輸入密碼。
  2. 使用用戶輸入的密碼進行操作。
  3. 產生所需的輸出(或執行所需的操作)。
  4. ol>

    因此,您的問題可以縮小到步驟#3

    是否可以在不使用程序XYZ的情況​​下產生理想的輸出(或執行操作)?

    這裡可能有很多變體,但要點是該軟件 XYZ 執行特定步驟以產生結果。

    如果可以創建一個程序 ABC ,它可以以合理的數量產生相同的結果時間而無需輸入密碼,則可以繞過 XYZ

    這表示整個“保護”是在程序 XYZ 本身中實現的。

    如果無法創建此類程序 ABC ,則保護取決於需要以下算法的算法:密碼無論使用何種程序

    示例1 :沒有特權的OS帳戶無法為另一個用戶設置密碼,因為它是由操作系統強制執行。因此,本例中的操作系統為 XYZ 。但是,由於原始操作系統此時無法正常工作,因此可以從可引導驅動器引導計算機並覆蓋包含密碼的文件,因此它無法強制執行保護。因此,我們無需使用 XYZ 程序即可產生理想的結果。

    示例2 :在第二個示例中,使用強大的加密算法對操作系統的系統驅動器進行了正確加密。如果我們使用可引導驅動器引導計算機以嘗試繞過原始操作系統,則會發現我們無法實現目標,因為我們無法訪問包含密碼的文件。它位於需要首先解密的分區上,但是我們不知道密碼。嘗試強行執行解密過程不會很快帶來期望的結果,因此在這種情況下,不可能繞過 XYZ 程序或具有類似功能的任何其他程序,因為基礎數據需要密碼

JDługosz
2016-12-12 13:23:51 UTC
view on stackexchange narkive permalink

郵政編碼不是您正在考慮的示例。但是很多東西都是 ,特別是時間或功能集受到限制的“試用”版本。

我記得編程雜誌上的兩篇文章(可能是 計算機語言)分別說明瞭如何執行此操作以及如何阻止嘗試對您的代碼進行操作。

我知道實際情況是這樣的就像查找比較語句並更改跳轉條件(即更改一個字節)一樣簡單,以繞過實際檢查。

這是有時將代碼行作為程序的一部分編寫。但是對於激活密鑰之類的東西,整個行業如雨後春筍般湧現,並且作者可以提供一個套件,該套件會混淆實際的測試,並且如果嘗試使用程序員調試代碼所熟悉的常用技術來抑制該程序,則該程序將難以運行。

TheKLF99
2016-12-12 17:47:07 UTC
view on stackexchange narkive permalink

這完全取決於解碼密碼時系統的工作方式。

您正在想像一個非常基本的“登錄”類型密碼系統,該系統可能會被滲透。但是,諸如ZIP文件之類的東西以及網站使用各種方法來打擊人們,只是編輯系統以迫使其顯示密碼即可。

一種方法是將MD5與“ salt”一起使用以增強安全性-這是基於以下事實:密碼已變成無法識別的無法識別的代碼-發生的基本示例如下:

系統要求輸入密碼-例如PASSWORDSystem在密碼中添加“鹽”-例如1234(密碼現在為PASSWORD1234)系統在密碼上使用帶有鹽的MD5-大多數人都會知道,密碼本身會生成MD5代碼319f4d26e3c536b5dd871bb2c52e3178,但是在密碼中添加了“ 1234”鹽後,MD5現在變為579f276ad2a77a7fd1698c38e3ad4d20完全不同的代碼。

這時系統仍然沒有檢查密碼是否有效,然後將新代碼傳遞到程序的另一部分,該部分決定MD5代碼符合預期,如果它確實顯示文件(初始密碼已從內存中長期丟棄)。

要使某人滲透到這種類型的密碼,他們需要獲取輸入的初始密碼。首先,然後找出程序是否允許打開文件。在計算機上的某個軟件上,可能可以獲取密碼,然後稍後再查看是否已打開文件並以這種方式獲取密碼,但是是否將密碼作為MD5 +鹽發送到了另一台服務器(例如通過javascript和PHP),這變得更加棘手,因為一台計算機將密碼轉換為內存,而php服務器只有md5 + salt密碼,無法將其轉換回去。

此外,使用的另一種方法是獲取密碼並以某種方式在數據中對其進行編碼,例如zip文件的工作方式。例如,我有一個帶有以下文本的文件...。

那隻棕色的狐狸跳過了那隻懶狗

我給它一個字母的密碼!好的,我知道這有點簡單,但這是一個簡單的示例-計算機可以將其轉換!轉換為等效的ASCII碼,並從中減去每個字母的ascii碼以對其進行編碼-的ascii碼!是33,t的ascii碼是116,而116-33 = 83,這是大寫字母S的ascii碼,因此,當數據被加密時,上述行最終存儲為

SGD PTHBJ AQNVM ENW ITLOR NUDQ SGD K @ YX CNF

現在,如果有人試圖對該消息進行解密,則您不知道他們是否擁有正確的密碼-如果輸入的密碼是#而不是!他們會收到以下消息給他們

vjg swkem dtqyp hqz lworu qxgt vjg nc | {fqi

-這沒有任何意義-因此大多數係統實際上都在檢查有效性密碼,但他們最初會更改密碼,因此不能被僅轉移結果的人所使用-有時這種情況只有在有人創建自己的假網站或程序並讓用戶最初輸入密碼時才會被破解進入偽造的程序或網站,當然,現在許多網站甚至通過使用身份驗證令牌來解決這個問題,該令牌生成的特殊密碼一次僅有效5分鐘(例如,HSBC智能密鑰)。

如果不提及MD5,則此答案會更好,因為MD5不管用什麼鹽,對於密碼來說都是一個非常糟糕的哈希函數選擇,並且任何使用它的人都是錯誤的。這確實損害了您的示例的信譽。
JesseM
2016-12-13 06:51:05 UTC
view on stackexchange narkive permalink

該問題需要澄清。您對如何讀取受密碼保護的zipfile的理解是不正確的。正如其他人指出的那樣,壓縮文件是zip文件(數據已加密),密碼是解密的密鑰。

您要描述的內容(通過對代碼流進行反向工程來重定向代碼執行)將

因此,對於您的原始問題:

是否可以更改軟件邏輯來執行命令而不是執行另一個命令?如果是這樣,那麼什麼都無法防止破解?

當然可以改變軟件邏輯來執行命令,通過逆向工程繞過訪問控制來執行程序可以做的事情。但是,這不支持您的第二個說法,即“任何東西都無法防止破裂”。加密的zipfile是一個很好的示例,說明您對代碼的控制無法獲取文件的內容。

在這種情況下,密鑰不是防止您執行代碼路徑的網守,而是獲取純文本數據所需的組件。與程序流控制無關。

jammy47
2016-12-12 04:11:10 UTC
view on stackexchange narkive permalink

這基本上稱為破解,可以使用調試器完成。有條件跳轉(例如je,jne,jnz等)可以通過實現這一目標來解決。 Lena關於tuts4的反向教程應該是一個好的開始。

這不能回答問題,而且還是不正確的(例如,對於加密的* .zip文件,使用您的方法不會太遠)。
kokociel
2016-12-13 10:27:55 UTC
view on stackexchange narkive permalink

最好描述為“逆向工程”的過程是定時攻擊,其中涉及分析驗證密碼所花費的時間。確實有可能減慢算法的處理速度併計算拒絕密碼所需的處理器滴答次數。當您正確猜出更多字母時,拒絕它會花費更長的時間,因此您可以在猜測中得到指導。

這不僅是一種假設情況,而且還可能會導致誤解。此攻擊已針對SSL和某些Unix版本使用。



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