Shell 篩選符合條件的 ELF 檔案

2022-06-18 04:51:06 字數 3793 閱讀 6997

我們知道在 cpu 上執行的是低階別的機器語言,從高階語言到低階別的機器語言是要經過 4 個編譯過程,以 linux 下 gcc 編譯 c 語言程式的過程為例,

如下圖所示:

預處理:編譯器將 c 源**中的包含的標頭檔案如stdio.h編譯進來,替換巨集。

gcc -e hello.c -o hello.i

編譯:gcc 首先要檢查**的規範性、是否有語法錯誤等,以確定**的實際要做的工作,在檢查無誤後,gcc 把**翻譯成組合語言。

gcc –s hello.i –o hello.s

彙編:把編譯階段生成的 」.s」 檔案轉成二進位制目標**。

gcc –c hello.s –o hello.o

gcc hello.o –o hello

目標**(object code):指編譯器和彙編器處理源**後所生成的機器語言目標**

目標檔案(object file):指包含目標**的檔案

可重定位目標檔案(.o 檔案):包含二進位制**和資料,其形式可以和其他目標檔案進行合併,建立乙個可執行目標檔案

可執行目標檔案(如 vi,gdb):包含二進位制**和資料,可直接被載入器載入執行

目標檔案在不同的系統或平台上具有不同的命名格式。如下所示:

elf 檔案即是 linux 等類 unix 上的目標檔案

elf 檔案提供了兩種不同的視角,在彙編器和鏈結器看來,elf 檔案是由 section header table 描述的一系列 section 的集合,而執行乙個 elf 檔案時,在載入器(loader)看來它是由 program header table 描述的一系列 segment 的集合。

兩種不同的視角對應兩種檢視,如下所示:

執行檢視(被執行):可執行目標檔案

常見的 elf 檔案大致結構如下:

elf 頭部(elf header):描述整個檔案的組織結構。

程式頭部表(program header table):描述檔案中的各種 segments,用來告訴系統如何建立程序映像的。

節區/段區(section/segments):segments 是從執行的角度來描述 elf 檔案,sections 是從鏈結的角度來描述 elf檔案,也就是說,在鏈結階段,我們可以忽略 program header table 來處理此檔案,在執行階段可以忽略 section header table 來處理此程式。從圖中我們也可以看出,segments 與 sections 是包含的關係,乙個s egment 包含若干個 section。

節區頭部表(section header table):包含了檔案各個 section 的屬性資訊。描述節區的表,每個節區佔乙個項。

4.1.1 格式

readelf elf-file(s)

4.1.2 功能

用於顯示讀取 elf 檔案中資訊。它用來顯示乙個或者多個 elf 格式的目標檔案的資訊,可以通過它的選項來控制顯示哪些資訊。

這裡的 elf-file(s) 就表示那些被檢查的檔案。可以支援 32 位,64 位的 elf 格式檔案,也支援包含 elf 檔案的文件

4.1.3 選項

-a :--all 顯示全部資訊,等價於 -h -l -s -s -r -d -v -a -i

-h :--file-header 顯示elf檔案開始的檔案頭資訊.

-l :--program-headers ;--segments 顯示程式頭(段頭)資訊(如果有的話)。

-s :--section-headers ;--sections 顯示節頭資訊(如果有的話)。

-g :--section-groups 顯示節組資訊(如果有的話)。

-t :--section-details 顯示節的詳細資訊(-s的)。

-s :--syms ;--symbols 顯示符號表段中的項(如果有的話)。

-e :--headers 顯示全部頭資訊,等價於: -h -l -s

-n :--notes 顯示note段(核心注釋)的資訊。

-r :--relocs 顯示可重定位段的資訊。

-u :--unwind 顯示unwind段資訊。當前只支援ia64 elf的unwind段資訊。

-d :--dynamic 顯示動態段的資訊。

-v :--version-info 顯示版本段的資訊。

-a :--arch-specific 顯示cpu構架資訊。

-d :--use-dynamic 使用動態段中的符號表顯示符號,而不是使用符號段。

-x :--hex-dump=以16進製制方式顯示指定段內內容。number指定段表中段的索引,或字串指定檔案中的段名。

-w[liaprmffsor]或者

-debugdump[=line,=info,=abbrev,=pubnames,=aranges,

=macro,=frames,=frames-interp,=str,=loc,=ranges] 顯示除錯段中指定的內容。

-i :--histogram 顯示符號的時候,顯示bucket list長度的柱狀圖。

-v :--version 顯示readelf的版本資訊。

-h :--help 顯示readelf所支援的命令列選項。

-w :--wide 寬行輸出。

#! /bin/bash

# 功能:檢測當前目錄下的所有 elf 檔案中是否有敏感字, 將符合條件的 elf 檔案路徑存入 result(nm,cat,readelf,objdump)

# 前置條件:

# 當前目錄下的 sensitive.txt : 敏感字字典

# 輸出:

# elf : 當前目錄下所有 elf 檔案的路徑

# result : 含有敏感字的 elf 檔案路徑

# 篩選當前目錄下所有 elf 檔案,並將檔案路徑存入 elf

function findelf

\; | grep "\" | awk -f ':' '' > elf

}# 通過 cat 查詢敏感字,將符合條件的 elf 檔案路徑存入 result

function findsensitiveby_cat

# 通過 nm 查詢敏感字,將符合條件的 elf 檔案路徑存入 result

function findsensitiveby_nm

# 通過 readelf 查詢敏感字,將符合條件的 elf 檔案路徑存入 result

function findsensitiveby_readelf

# 通過 objdump 查詢敏感字,將符合條件的 elf 檔案路徑存入 result

function findsensitiveby_objdump

findelf

findsensitiveby_cat elf

findsensitiveby_nm elf

findsensitiveby_readelf elf

findsensitiveby_objdump elf

java 根據條件從List中篩選出符合條件的集合

1 list 你要在裡面篩選的物件集合 存放格式例如 list.add user1 list.add user2 list.add user3 2 tablecolumnname user 裡面的屬性字段 例如 name 3 agers name欄位的屬性值,也就是你要篩選出 name 的名稱為 張...

尋找符合條件的整數

題目 任意給定乙個正整數n,求乙個最小的正整數m m 1 使得n m的十進位制表示形式裡只含有1和0.解決這個問題首先考慮對於任意的n,是否這樣的m一定存在。可以證明,m是一定存在的,而且不唯一。簡單證明 因為 這是乙個無窮數列,但是數列中的每一項取值範圍都在 0,n 1 之間。所以這個無窮數列中間...

不符合專利的條件的幾種條件

一些屬於不符合專利授予條件的客體 一 科學發現 二 智力活動的規則和方法 三 疾病的診斷和 方法 四 動物和植物品種 五 用原子核變換方法獲得的物質 六 對平面印刷品的圖案 色彩或者二者的結合作出的主要起標識作用的設計 在中國,專利遵循 先申請原則 即兩個以上的申請人分別就同樣的發明創造申請專利的,...