如何從linux命令列檢視二進位制檔案

有神祕檔案嗎?Linux file命令將快速告訴您它是什麼型別的檔案。如果它是一個二進位制檔案,你可以找到更多關於它。檔案裡有一大堆馬廄,可以幫你分析。我們將向您展示如何使用這些工具。...

有神祕檔案嗎?Linux file命令將快速告訴您它是什麼型別的檔案。如果它是一個二進位制檔案,你可以找到更多關於它。檔案裡有一大堆馬廄,可以幫你分析。我們將向您展示如何使用這些工具。

識別檔案型別

檔案通常具有一些特性,允許軟體包識別它是哪種型別的檔案,以及其中的資料表示什麼。嘗試在MP3音樂播放器中開啟PNG檔案是沒有意義的,因此檔案攜帶某種形式的ID既有用又實用。

這可能是檔案開頭的幾個簽名位元組。這允許檔案明確其格式和內容。有時,檔案型別是從資料本身內部組織的一個獨特方面推斷出來的,稱為檔案體系結構。

有些作業系統,如Windows,完全由副檔名引導。您可以稱之為輕信或信任,但Windows假定任何具有DOCX副檔名的檔案實際上都是DOCX字處理檔案。Linux不是那樣的,你很快就會看到。它需要證據並在檔案中查詢。

這裡描述的工具已經安裝在我們用來研究本文的manjaro20、fedora21和ubuntu20.04發行版上。我們用檔案命令開始調查吧。

使用file命令

我們在當前目錄中有一個不同檔案型別的集合。它們是文件、原始碼、可執行檔案和文字檔案的混合體。

ls命令將顯示目錄中的內容,-hl(人類可讀大小,長列表)選項將顯示每個檔案的大小:

ls -hl

如何從linux命令列檢視二進位制檔案

讓我們試試這些檔案,看看我們得到了什麼:

file build_instructi***.odt file build_instructi***.pdf file COBOL_Report_Apr60.djvu

如何從linux命令列檢視二進位制檔案

正確識別了這三種檔案格式。在可能的情況下,檔案給了我們更多的資訊。據報道,PDF檔案為1.5版格式。

即使我們將ODT檔案重新命名為具有任意值XYZ的副檔名,在檔案瀏覽器和使用file的命令列中,仍然可以正確識別該檔案。

如何從linux命令列檢視二進位制檔案

在檔案瀏覽器中,它被賦予了正確的圖示。在命令列上,file忽略副檔名並檢視檔案內部以確定其型別:

file build_instructi***.xyz

如何從linux命令列檢視二進位制檔案

使用媒體上的檔案(如影象和音樂檔案)通常會產生有關其格式、編碼、解析度等的資訊:

file screenshot.png file screenshot.jpg file Pachelbel_Canon_In_D.mp3

如何從linux命令列檢視二進位制檔案

有趣的是,即使是純文字檔案,file也不會根據副檔名來判斷檔案。例如,如果您有一個副檔名為“.c”的檔案,其中包含標準純文字,但不包含原始碼,則該檔案不會將其誤認為是真正的c原始碼檔案:

file function+headers.h file makefile file hello.c

如何從linux命令列檢視二進位制檔案

檔案將標頭檔案(“.h”)正確地標識為檔案的C原始碼集合的一部分,並且它知道makefile是一個指令碼。

將檔案與二進位制檔案一起使用

二進位制檔案比其他檔案更像一個“黑匣子”。可以透過適當的軟體包檢視影象檔案、播放聲音檔案和開啟文件檔案。不過,二進位制檔案更具挑戰性。

例如,檔案“hello”和“wd”是二進位制可執行檔案。它們是程式。名為“wd.o”的檔案是一個物件檔案。當編譯器編譯原始碼時,會建立一個或多個目標檔案。這些包含計算機在完成的程式執行時最終將執行的機器程式碼,以及連結器的資訊。連結器檢查每個物件檔案中對庫的函式呼叫。它將它們連結到程式使用的任何庫。這個過程的結果是一個可執行檔案。

“檔案”監視.exe“是已交叉編譯以在Windows上執行的二進位制可執行檔案:

file wd file wd.o file hello file watch.exe

如何從linux命令列檢視二進位制檔案

先拿最後一個,檔案告訴我們監視.exe“檔案是一個PE32+可執行控制檯程式,用於Microsoft Windows上的x86系列處理器。PE代表可移植可執行格式,它有32位和64位版本。PE32是32位版本,PE32+是64位版本。

其他三個檔案都被標識為可執行和可連結格式(ELF)檔案。這是可執行檔案和共享物件檔案(如庫)的標準。我們將很快了解ELF頭格式。

您可能會注意到,這兩個可執行檔案(“wd”和“hello”)被標識為Linux標準基(LSB)共享物件,而物件檔案“wd.o”被標識為LSB可重定位檔案。“可執行檔案”這個詞顯然不存在。

物件檔案是可重定位的,這意味著其中的程式碼可以在任何位置載入到記憶體中。可執行檔案被列為共享物件,因為它們是由連結器從物件檔案建立的,這樣它們就繼承了這個功能。

這允許地址空間佈局隨機化(ASMR)系統將可執行檔案載入到其選擇的地址的記憶體中。標準可執行檔案的標頭檔案中有一個載入地址編碼,該地址指示將它們載入到記憶體中的位置。

ASMR是一種安全技術。將可執行檔案以可預測的地址載入到記憶體中,使它們容易受到攻擊。這是因為攻擊者總是知道它們的入口點和函式的位置。定位在隨機地址的獨立可執行檔案(PIE)克服了這種敏感性。

如果我們用gcc編譯器編譯程式並提供-no-pie選項,我們將生成一個常規的可執行檔案。

-o(輸出檔案)選項允許我們為可執行檔案提供名稱:

gcc -o hello -no-pie hello.c

我們將在新的可執行檔案上使用檔案,並檢視發生了什麼變化:

file hello

可執行檔案的大小與以前相同(17 KB):

ls -hl hello

如何從linux命令列檢視二進位制檔案

二進位制檔案現在被標識為標準可執行檔案。我們這樣做只是為了演示。如果這樣編譯應用程式,您將失去ASMR的所有優點。

為什麼可執行檔案這麼大?

我們的示例hello程式是17kb,所以它很難被稱為big,但是,一切都是相對的。原始碼為120位元組:

cat hello.c

如果它只需要在終端視窗中列印一個字串,那麼二進位制檔案的擴充套件是什麼呢?我們知道有一個ELF頭,但是對於一個64位二進位制檔案來說只有64位元組長。很明顯,這肯定是另外一回事:

ls -hl hello

如何從linux命令列檢視二進位制檔案

讓我們用strings命令掃描二進位制檔案,作為發現其中內容的簡單第一步。我們將把它輸送到更少的地方:

strings hello | less

如何從linux命令列檢視二進位制檔案

二進位制檔案中除了“你好,極客世界!“從我們的原始碼。其中大部分是二進位制檔案中區域的標籤,以及共享物件的名稱和連結資訊。這些庫包括二進位制檔案所依賴的庫和這些庫中的函式。

ldd命令顯示二進位制檔案的共享物件依賴關係:

ldd hello

如何從linux命令列檢視二進位制檔案

輸出中有三個條目,其中兩個包含目錄路徑(第一個不包含):

  • linux作業系統-vdso.so公司:虛擬動態共享物件(VDSO)是一種核心機制,允許使用者空間二進位制檔案訪問一組核心空間例程。這避免了從使用者核心模式切換上下文的開銷。VDSO共享物件遵循可執行和可連結格式(ELF)格式,允許它們在執行時動態連結到二進位制檔案。VDSO是動態分配的,並利用ASMR。如果核心支援ASMR方案,那麼VDSO功能由標準gnuc庫提供。
  • libc.so公司.6:GNUC庫共享物件。
  • /lib64/ld-linux-x86-64.so.2:這是二進位制檔案想要使用的動態連結器。動態連結器詢問二進位制檔案以發現它有哪些依賴關係。它將這些共享物件送入記憶體。它準備執行二進位制檔案,並能夠找到和訪問記憶體中的依賴項。然後,它啟動程式。

精靈頭像

我們可以使用readelf實用程式和-h(檔案頭)選項檢查並解碼ELF頭:

readelf -h hello

如何從linux命令列檢視二進位制檔案

標題為我們解釋。

如何從linux命令列檢視二進位制檔案

所有ELF二進位制檔案的第一個位元組被設定為十六進位制值0x7F。接下來的三個位元組被設定為0x45、0x4C和0x46。第一個位元組是將檔案標識為ELF二進位制檔案的標誌。為了清楚地說明這一點,接下來的三個位元組用ASCII碼拼寫出“ELF”:

  • 類:指示二進位制檔案是32位還是64位可執行檔案(1=32,2=64)。
  • 資料:表示正在使用的endianness。Endian編碼定義了多位元組數的儲存方式。在big-endian編碼中,首先儲存一個數字的最高有效位。在little endian編碼中,首先儲存數字的最低有效位。
  • 版本:ELF的版本(目前是1)。
  • OS/ABI:表示正在使用的應用程式二進位制介面的型別。這定義了兩個二進位制模組(如程式和共享庫)之間的介面。
  • ABI版本:ABI的版本。
  • 型別:ELF二進位制檔案的型別。常見的值是可重定位資源(如物件檔案)的ET\u REL、使用-no pie標誌編譯的可執行檔案的ET\u EXEC和支援ASMR的可執行檔案的ET\u DYN。
  • 機器:指令集結構。這表示為其建立二進位制檔案的目標平臺。
  • 版本:對於這個版本的ELF,總是設定為1。
  • 入口點地址:二進位制檔案中開始執行的記憶體地址。

其他條目是二進位制檔案中區域和部分的大小和數量,因此可以計算它們的位置。

使用hexdump快速檢視二進位制檔案的前8個位元組,將顯示檔案前4個位元組中的簽名位元組和“ELF”字串。-C(canonical)選項為我們提供位元組的ASCII表示及其十六進位制值,-n(number)選項讓我們指定要檢視的位元組數:

hexdump -C -n 8 hello

如何從linux命令列檢視二進位制檔案

objdump和粒度檢視

如果您想檢視細節,可以使用objdump命令和-d(反彙編)選項:

objdump -d hello | less

如何從linux命令列檢視二進位制檔案

這將反彙編可執行的機器程式碼,並以十六進位制位元組與組合語言等價物一起顯示。每行中第一個bye的地址位置顯示在最左邊。

只有當你能讀懂組合語言,或者你好奇幕後發生了什麼時,這才有用。有很多輸出,所以我們把它輸送到更少的地方。

如何從linux命令列檢視二進位制檔案

編譯和連結

有許多方法可以編譯二進位制檔案。例如,開發人員選擇是否包含除錯資訊。二進位制檔案的連結方式也影響其內容和大小。如果二進位制引用將物件作為外部依賴項共享,那麼它將小於依賴項靜態連結到的物件。

大多數開發人員已經知道我們在這裡介紹的命令。不過,對於其他人來說,它們提供了一些簡單的方法來翻查二進位制黑盒中的內容。

  • 發表於 2021-04-02 04:41
  • 閱讀 ( 49 )
  • 分類:網際網路

你可能感興趣的文章

關於基於golang的惡意軟體,您需要了解什麼

...雖然有很多這樣惡劣的資訊竊取者,使這一個更陰險的是如何針對多個作業系統。 ...

  • 發佈於 2021-03-11 10:52
  • 閲讀 ( 65 )

您需要了解的關於檔案格式及其屬性的所有資訊

...您可以嘗試用文字編輯器開啟這些檔案,但它可能不知道如何解釋它們。下面顯示了嘗試使用文字編輯器開啟Microsoft Excel檔案的結果。 ...

  • 發佈於 2021-03-14 03:30
  • 閲讀 ( 45 )

這就是軟體安裝程式在windows、macos和linux上的工作方式

... 讓我們看看軟體是如何安裝在三大桌面平臺上的:Windows、macOS和Linux。 ...

  • 發佈於 2021-03-14 18:20
  • 閲讀 ( 46 )

如何在linux上使用gnupg進行加密

...給某人的敏感資訊,如密碼或伺服器登入資訊,但不知道如何安全地傳送這些資訊以避免資訊落入壞人手中? ...

  • 發佈於 2021-03-28 23:05
  • 閲讀 ( 54 )

哪個linux shell最好?比較了5種常見的貝殼

...你的計算機需要一個翻譯層。這介於你告訴它做什麼和它如何理解之間。 ...

  • 發佈於 2021-03-30 18:45
  • 閲讀 ( 50 )

在linux上使用brim轉換wireshark工作流

...獲和資料包分析,Brim將徹底改變你的工作流程。 相關:如何在Linux上使用Wireshark過濾器 安裝邊緣 Brim非常新,所以它還沒有進入Linux發行版的軟體庫。不過,在Brim下載頁面上,您會找到DEB和RPM包檔案,因此在Ubuntu或Fedora上安裝...

  • 發佈於 2021-04-01 14:53
  • 閲讀 ( 53 )

為什麼linux的systemd在這麼多年後仍然存在分歧

...看到PID為1的過程是系統化的。在Manjaro-Linux上執行相同的命令會產生不同的結果。PID為1的程序被標識為/**in/init。快速檢視該檔案會發現它是指向systemd的符號連結: ps -fp 1 ls -hl /**in/init 透過對ps使用ppid(父程序ID)選項,我們可...

  • 發佈於 2021-04-02 02:56
  • 閲讀 ( 44 )

如何在linux中向$path新增目錄

...但這並沒有什麼不好的地方。我們將解釋它的作用,以及如何調整它。 什麼是$path,它是如何工作的($path on linux, and how does it work)? 當您在終端視窗中鍵入一個命令並按Enter鍵時,您甚至在執行命令之前就開始了大量的活動。 B...

  • 發佈於 2021-04-02 14:04
  • 閲讀 ( 42 )

如何在linux上使用tail命令

...料。它甚至可以實時顯示新增到檔案中的更新。我們教你如何使用它。 他殺了尾巴嗎? tail命令顯示檔案末尾的資料。通常,新資料會新增到檔案的末尾,因此tail命令是檢視檔案中最新新增內容的一種快速簡便的方法。它還可...

  • 發佈於 2021-04-02 17:32
  • 閲讀 ( 39 )

linux下如何使用which命令

...在shell中的,因此Bash不必費勁地查詢這些命令。 但是Bash如何定位其他命令、程式和外部獨立二進位制檔案呢?Bash使用路徑,實際上是一組路徑,每個路徑指向一個目錄。然後,它在每個目錄中搜索與您試圖執行的命令或程式匹...

  • 發佈於 2021-04-02 20:07
  • 閲讀 ( 50 )
ahj28578
ahj28578

0 篇文章

作家榜

  1. admin 0 文章
  2. 孫小欽 0 文章
  3. JVhby0 0 文章
  4. fvpvzrr 0 文章
  5. 0sus8kksc 0 文章
  6. zsfn1903 0 文章
  7. w91395898 0 文章
  8. SuperQueen123 0 文章

相關推薦