firmadyne原始碼 提取部分閱讀筆記
1.大華或者海康的攝像頭,包含web介面,做韌體抽取的實驗,確定是否成功;要排除mips及arm架構的特點 ;3.從抽取的原始碼上看,問題1:什麼是best?問題2:web介面的存在對抽取成功率的影響?問題3:mips還是arm是否影響抽取的成功率?
1.什麼是best?
答案:firmadyne提取檔案系統是使用binwalk API開發了一個自定義目標驅動的提取實用程式,採用遞迴的方法,從韌體的檔案系統中獲取根檔案系統和核心(可選)。
從函式中可以看出提取檔案系統中形參rootfs設定為TRUE,所以在執行過程中不需要加上檔案系統的實參。在提取之前,設定了閾值為4,只有當提取的根目錄大於4的時候才可以接著向下進行遞迴提取。這裡的提取目錄計算是根據所提取的目錄名是否在 UNIX_DIRS = ["bin", "etc", "dev", "home", "lib", "mnt", "opt", "root", "run", "sbin", "tmp", "usr", "var"] 中計算得來的。提取遞迴的程式碼如下:
def io_find_rootfs(start, recurse=True(遞迴)):
"""
Attempts to find a Linux root directory.
"""
# Recurse into single directory chains, e.g. jffs2-root/fs_1/.../ 遞迴到單個目錄鏈中,e.g.jffs2-根/fs-1/。。。
path = start
while (len(os.listdir(path)) == 1 and os.listdir()方法用於返回指定的資料夾包含的檔案或資料夾的名字的列表。 Python len()方法返回物件(字元、列表、元組等)長度或專案個數。
os.path.isdir(os.path.join(path, os.listdir(path)[0]))): os.path.isdir()函式判斷某一路徑是否為目錄;os.path.join()函式 將多個路徑組合後返回
path = os.path.join(path, os.listdir(path)[0])
# count number of unix-like directories 計算類unix目錄的數量。一
count = 0
for subdir in os.listdir(path):
if subdir in Extractor.UNIX_DIRS and \
os.path.isdir(os.path.join(path, subdir)):
count += 1
# check for extracted filesystem, otherwise update queue 檢查提取的檔案系統。否則更新佇列。
if count >= Extractor.UNIX_THRESHOLD:
return (True, path)
# in some cases, multiple filesystems may be extracted, so recurse to
# find best one 在某些情況下,可以提取多個檔案系統,然後遞迴到#找到最好的一個
if recurse:
for subdir in os.listdir(path):
if os.path.isdir(os.path.join(path, subdir)):
res = Extractor.io_find_rootfs(os.path.join(path, subdir),
False)
if res[0]:
return res
return (False, start)
在提取完根目錄後再將所提取的根目錄作為形參繼續遞迴提取根目錄下的檔案,所謂的best是指將根目錄下的所有檔案都提取完全,(相對來說),無法在遞迴後再賦值為False接受遞迴。
- 海康威視的網路攝像頭都有web介面,大華系列的都可以。
3.從原始碼中來看,web介面的存在與否以及MIPS還是ARM不影響抽取的成功率 。
是利用binwalk來提取核心與檔案系統:
目前所支援的三種組合:
如何驗證成功提取: