計算機(jī)文件 一般分為兩類:二進(jìn)制文件 和 ASCII文件(也稱純文本文件)式塌。
ASCII文件:用純文本編輯器能夠打開且打開文件的內(nèi)容是人類能夠理解的可顯示字符劝术。
二進(jìn)制文件:狹義的說缩多,除去純文本文件以外的文件均為二進(jìn)制文件,它們的存儲形式為二進(jìn)制养晋。
二進(jìn)制文件的一些描述
二進(jìn)制文件在不同操作系統(tǒng)上的表現(xiàn)形式不一樣衬吆。通過基于 unix 操作系統(tǒng)的 file
命令可以獲得二進(jìn)制文件的相關(guān)描述,如:
setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 2.6.24, BuildID[sha1]=c5ecc1690866b3bb085d59e87aad26a1e386aaeb, not stripped
下面我們來分析下這段輸出到底描述了些什么绳泉。
ELF (Excutable and Linkable Format)
可執(zhí)行與可鏈接格式(ELF)在計算機(jī)科學(xué)中是一種用于可執(zhí)行文件逊抡、目標(biāo)文件、共享庫和核心轉(zhuǎn)儲的標(biāo)準(zhǔn)文件格式零酪。1999年冒嫡,被86open項目選為x86架構(gòu)上的類Unix操作系統(tǒng)的二進(jìn)制文件格式標(biāo)準(zhǔn),用來取代COFF四苇。因其可擴(kuò)展性與靈活性孝凌,也可應(yīng)用在其它處理器、計算機(jī)系統(tǒng)架構(gòu)的操作系統(tǒng)上月腋。
具體參考:Excutable and Linkable Format
其它文件格式:
PE (Portable Excutable) —— 針對 Windows 操作系統(tǒng)
Mach-O(Mach object) —— 針對 NeXTSTEP蟀架、 OS X 和 iOS
32-bit
不同操作系統(tǒng)寫入二進(jìn)制文件的方式,與操作系統(tǒng)的匯編指令集有關(guān)榆骚。這里的 32-bit 不是代表編譯該文件的操作系統(tǒng)就是32位操作系統(tǒng)片拍,兩者之間沒有關(guān)聯(lián)。不同的操作系統(tǒng)可以使用不同的匯編指令集編譯出具有相同功能的程序妓肢。
常見的匯編指令集有MIPS32(32-bit)穆碎、MIPS64、ARM职恳、PowerPC所禀、x86(32-bit)和x86-64(64-bit)等,最后兩個匯編指令集是比較常見的放钦。
LSB (Linux Stardard Base)
LSB
是 Linux標(biāo)準(zhǔn)規(guī)范的英文縮寫色徘。
Intel 80386
Intel 80386是Intel的32位微處理器。這意味著該可執(zhí)行文件可以在Intel的80386微處理器或與其兼容的任何設(shè)備上運(yùn)行操禀。最新的64位微處理器都向后兼容32位微處理器褂策。
SYSV
SYSV
指的就是 UNIX System V。UNIX System V是Unix操作系統(tǒng)眾多版本中的一支颓屑。它最初由AT&T開發(fā)斤寂,在1983年第一次發(fā)布,因此也被稱為AT&T System V揪惦。一共發(fā)行了4個System V的主要版本:版本1遍搞、2、3和4器腋。Unix的另一個主要版本是BSD(伯克利軟件發(fā)行版)溪猿。
其它:
- GNU/Linux —— Linux 操作系統(tǒng)
Dynamically linked (uses shared libs)
在動態(tài)鏈接中,將外部庫(共享庫)的名稱放置在最終的可執(zhí)行文件中纫塌,而實(shí)際鏈接是在運(yùn)行時才將可執(zhí)行文件和庫都放置在內(nèi)存中時執(zhí)行的诊县。因此,我們不必將標(biāo)準(zhǔn)庫保留在二進(jìn)制文件中(您可以將它們導(dǎo)入程序中)措左。這有助于減小文件大小依痊,并允許多個程序使用可執(zhí)行模塊的單個副本。
其它:
- Static linking
在 Static linking
(靜態(tài)鏈接) 中怎披,程序中使用的所有庫模塊均被復(fù)制到最終的可執(zhí)行文件中胸嘁。這是由鏈接器執(zhí)行的,并且是編譯過程的最后一步钳枕。這會大大增加文件大小缴渊。
但是,使用靜態(tài)鏈接庫的程序通常比使用共享庫的程序快鱼炒。同樣在靜態(tài)鏈接程序中衔沼,所有代碼都包含在一個可執(zhí)行模塊中。因此昔瞧,它們幾乎不會遇到兼容性問題指蚁。
interpreter /lib/ld-
這是 ELF(可執(zhí)行與可鏈接格式)
解釋器。它負(fù)責(zé)動態(tài)鏈接自晰。
for GNU/Linux 2.6.24
與程序目標(biāo)鏈接 C 庫的 Linux 系統(tǒng)內(nèi)核版本凝化。
not stripped
not stripped
直譯就是 沒有剝離
的意思。此信息表示可執(zhí)行程序和原始源代碼之間存在關(guān)系酬荞。它包括諸如全局和靜態(tài)變量名稱以及函數(shù)名稱之類的內(nèi)容搓劫。
相反瞧哟,stripped
代表沒有這些調(diào)試信息。
好了~ 上面就是關(guān)于使用 file
命令查出的一些關(guān)于二進(jìn)制文件的描述枪向。這對我們?nèi)腴T CTF 也有一定的幫助勤揩。
Reference
參考資料 Knowing your Binary!