比方說,我在自己的操作系統(Windows或其他操作系統)中擁有Admin特權。安裝並執行軟件 XYZ 時,這意味著操作系統與 XYZ 之間存在通信,並且操作系統將執行並查看 XYZ 所做的一切。
這是我對密碼(例如.zip密碼)的看法:
是否可以更改軟件執行命令而不是其他命令的邏輯?如果是這樣,那麼什麼都無法防止破裂?
比方說,我在自己的操作系統(Windows或其他操作系統)中擁有Admin特權。安裝並執行軟件 XYZ 時,這意味著操作系統與 XYZ 之間存在通信,並且操作系統將執行並查看 XYZ 所做的一切。
這是我對密碼(例如.zip密碼)的看法:
是否可以更改軟件執行命令而不是其他命令的邏輯?如果是這樣,那麼什麼都無法防止破裂?
簡而言之,是的,您可以修改可執行文件,使用調試器等來更改正在執行的代碼的邏輯。
但是,這可能還不夠。
要使用“ .zip密碼”示例,受密碼保護的檔案庫使用密碼來導出加密密鑰。除非您提供正確的密碼,否則生成的密鑰將是錯誤的,即使將其修改為使用了錯誤的密鑰,也無法成功解密ZIP文件。
另一種情況可能涉及setuid可執行文件,以更高的特權運行。您可以在調試器下運行它,也可以將其複製到您的用戶帳戶中並進行更改,但是只要在用戶權限下運行它,就可以實現所有這些,從而消除了利用可能性。
您對.zip密碼的認識不正確。許多其他程序還使用了這種方法,即在程序甚至達到“好還是不好的密碼”決定之前,始終運行解密算法並獲得結果。訣竅在於,解密會在任何密碼上產生垃圾,只有一個好的密碼可以“神奇地”(或更確切地說-在數學上)計算出正確的數據。因此程序不知道什麼是好密碼。
您想要破解的“好還是不好”時刻只會檢查結果是否為垃圾。覆蓋它並沒有太大好處。
是和否。
由於尚無人提出與現實生活(與計算機無關)的示例,因此我請在這裡嘗試:
想像一下要登機。您需要登機牌,否則安全人員將無法通過您。如果您有權訪問系統並且可以修改系統(例如您是CEO),那麼可以繞過安全性嗎?是!您可以:
現在,另一種情況:一堆保險箱存儲在銀行中。要打開保險箱,您需要一個物理鑰匙才能打開鎖。
您能拉出前面的把戲嗎?是的,您可以,但無濟於事。站在那裡的安全人員並不像可以使用所有保險箱的人那樣-他沒有任何保險箱的鑰匙。您可以擊敗他,但他不僅僅擁有打開鎖所必需的東西(物理鑰匙)。
您可以嘗試選擇鎖(強行施加),但是這樣做會非常耗時(現代加密密鑰的數學計算表明,即使您擁有世界上所有的計算機都在為您解鎖,也需要數十億年的時間來解鎖)。這樣就可以了-在這種設計(數據加密)中,獲取存儲數據的唯一方法是使用密鑰,因此無法繞過密鑰。
當然,軟件可以執行您編寫的所有代碼。
作為一個簡單的示例,如果提供了一個檢查密碼的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,然後將其加載。
將答案從“是”更改為“否”的真正區別是,如果密碼實際上不是密碼,而是加密密鑰。如果數據是加密的,那麼外部程序做什麼都沒關係-在解密算法得到正確的密鑰之前,數據仍然會加密。
假設您有一個將數據存儲在文本文件(或小型數據庫)中的應用程序,但是要從該應用程序訪問文件 ,您需要輸入密碼或使用特殊過程。您只需使用操作系統即可從文件目錄中打開文本文件(或db)(無需反向工程)。在過去的程序(尤其是遊戲)中,這種情況經常發生。
這就是為什麼希望安全的應用會採取措施保護數據免受OS本身侵害的原因。像加密數據或混淆數據使其難以使用。
這取決於軟件 XYZ 如何使用密碼來產生所需的操作以及它使用的數據類型。
如果我們看一下 XYZ 程序為:
因此,您的問題可以縮小到步驟#3 :
是否可以在不使用程序XYZ的情況下產生理想的輸出(或執行操作)?
這裡可能有很多變體,但要點是該軟件 XYZ 執行特定步驟以產生結果。
如果可以創建一個程序 ABC ,它可以以合理的數量產生相同的結果時間而無需輸入密碼,則可以繞過 XYZ 。
這表示整個“保護”是在程序 XYZ 本身中實現的。
如果無法創建此類程序 ABC ,則保護取決於需要以下算法的算法:密碼無論使用何種程序。
示例1 :沒有特權的OS帳戶無法為另一個用戶設置密碼,因為它是由操作系統強制執行。因此,本例中的操作系統為 XYZ 。但是,由於原始操作系統此時無法正常工作,因此可以從可引導驅動器引導計算機並覆蓋包含密碼的文件,因此它無法強制執行保護。因此,我們無需使用 XYZ 程序即可產生理想的結果。
示例2 :在第二個示例中,使用強大的加密算法對操作系統的系統驅動器進行了正確加密。如果我們使用可引導驅動器引導計算機以嘗試繞過原始操作系統,則會發現我們無法實現目標,因為我們無法訪問包含密碼的文件。它位於需要首先解密的分區上,但是我們不知道密碼。嘗試強行執行解密過程不會很快帶來期望的結果,因此在這種情況下,不可能繞過 XYZ 程序或具有類似功能的任何其他程序,因為基礎數據需要密碼。
郵政編碼不是您正在考慮的示例。但是很多東西都是 ,特別是時間或功能集受到限制的“試用”版本。
我記得編程雜誌上的兩篇文章(可能是 計算機語言)分別說明瞭如何執行此操作以及如何阻止嘗試對您的代碼進行操作。
我知道實際情況是這樣的就像查找比較語句並更改跳轉條件(即更改一個字節)一樣簡單,以繞過實際檢查。
這是有時將代碼行作為程序的一部分編寫。但是對於激活密鑰之類的東西,整個行業如雨後春筍般湧現,並且作者可以提供一個套件,該套件會混淆實際的測試,並且如果嘗試使用程序員調試代碼所熟悉的常用技術來抑制該程序,則該程序將難以運行。
這完全取決於解碼密碼時系統的工作方式。
您正在想像一個非常基本的“登錄”類型密碼系統,該系統可能會被滲透。但是,諸如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智能密鑰)。
該問題需要澄清。您對如何讀取受密碼保護的zipfile的理解是不正確的。正如其他人指出的那樣,壓縮文件是zip文件(數據已加密),密碼是解密的密鑰。
您要描述的內容(通過對代碼流進行反向工程來重定向代碼執行)將
因此,對於您的原始問題:
是否可以更改軟件邏輯來執行命令而不是執行另一個命令?如果是這樣,那麼什麼都無法防止破解?
當然可以改變軟件邏輯來執行命令,通過逆向工程繞過訪問控制來執行程序可以做的事情。但是,這不支持您的第二個說法,即“任何東西都無法防止破裂”。加密的zipfile是一個很好的示例,說明您對代碼的控制無法獲取文件的內容。
在這種情況下,密鑰不是防止您執行代碼路徑的網守,而是獲取純文本數據所需的組件。與程序流控制無關。
這基本上稱為破解,可以使用調試器完成。有條件跳轉(例如je,jne,jnz等)可以通過實現這一目標來解決。 Lena關於tuts4的反向教程應該是一個好的開始。
最好描述為“逆向工程”的過程是定時攻擊,其中涉及分析驗證密碼所花費的時間。確實有可能減慢算法的處理速度併計算拒絕密碼所需的處理器滴答次數。當您正確猜出更多字母時,拒絕它會花費更長的時間,因此您可以在猜測中得到指導。
這不僅是一種假設情況,而且還可能會導致誤解。此攻擊已針對SSL和某些Unix版本使用。