根據我組成員(@一夕思醉,@2018/7/11)的熱烈討論,我們對該題目有了一個大致的了解。
題目要求:
對於Linux下給定的ELF可執行程序、自行開發簽名工具對程序的代碼段(Load Segment)首先進行散列,然后對散列值進行簽名,簽名數據應作為單獨的節(Section)附加到原ELF可執行程序的尾部。同時,應開發驗證軟件並加入操作系統,在運行任何ELF可執行程序前對ELF文件進行驗證,若ELF可執行程序沒有被簽名或者簽名驗證失敗則應停止運行本程序,若簽名驗證成功則可以正常運行。
簽名后的ELF可執行程序可正常運行在帶有簽名驗證的Linux操作系統上,以及不帶有簽名驗證機制的Linux操作系統上;
簽名后的ELF可執行程序中的簽名數據節應可通過readelf與objdump等程序解析得到正確的值;
運行ELF可執行程序的方式應保持不變,不得通過其他程序運行ELF可執行程序的方式驗證簽名;
簽名驗證所需要的公鑰、證書以及驗證程序可以預先設置在操作系統中;
本題不考察選手對加密算法的實現,因此選手可以選擇開源的加密軟件庫進行加密,但是對應強度應不低於RSA2048;
實現程序主要涉及對ELF可執行格式的理解、Linux操作系統下程序運行的機制的理解,以及對加密算法的運用。
分析:分為幾個步驟。第一步要做的是環境配置,這道題目對環境的要求還是比較嚴苛的,限定使用C語言和UOS系統。
第二步:實現對elf文件的程序解析和散列。
第三步:加入簽名程序,對散列值按照一定的規律進行記錄,並將簽名數據作為單獨的節加入到程序末尾
第四步:加入驗證程序,通過各種方法對簽名進行驗證,證明程序合法且未被篡改。
第五步:對判斷結果進行處理,若判斷結果為通過,運行,若判斷結果為不通過,則停止運行
大致可以分為這么五個部分
對涉及到的陌生詞匯進行解讀:RSA2048(rsa為加密方式,2048為加密程度)
ELF文件:
在計算機科學中,是一種用於二進制文件、可執行文件、目標代碼、共享庫和核心轉儲格式文件
散列:
Hash,一般翻譯做散列、雜湊,或音譯為哈希,是把任意長度的輸入通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。
現在面臨的問題:1.沒有環境 2.C語言掌握程度並不是很好 3.簽名與驗證系統的信息匹配較難實現。4.對ELF程序的識別以及散列存在技術問題。