0 运行环境

  • 本机系统:Windows 10

  • 虚拟机软件:Oracle VM VirtualBox 6

  • 虚拟机系统:Ubuntu 18

1 引言 - 编译过程

我们知道在 CPU 上执行的是低级别的机器语言,从高级语言到低级别的机器语言是要经过 4 个编译过程,以 Linux 下 GCC 编译 C 语言程序的过程为例,

如下图所示:

  1. 预处理:编译器将 C 源代码中的包含的头文件如stdio.h编译进来,替换宏。

    gcc -E hello.c -o hello.i

  2. 编译:GCC 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,GCC 把代码翻译成汇编语言。

    gcc –S hello.i –o hello.s

  3. 汇编:把编译阶段生成的 ”.s” 文件转成二进制目标代码。

    gcc –c hello.s –o hello.o

  4. 链接:链接到库中,生成可执行文件。

    gcc hello.o –o hello

2 目标文件

目标代码(Object Code):指编译器和汇编器处理源代码后所生成的机器语言目标代码

目标文件(Object File):指包含目标代码的文件

2.1 三种目标文件形式

  1. 可重定位目标文件(.o 文件):包含二进制代码和数据,其形式可以和其他目标文件进行合并,创建一个可执行目标文件

  2. 可执行目标文件(如 vi,gdb):包含二进制代码和数据,可直接被加载器加载执行

  3. 共享目标文件(.so 文件):可被动态的加载和链接

3 ELF 文件

目标文件在不同的系统或平台上具有不同的命名格式。如下所示:

  • DOS 操作系统 :COM 格式,文件中仅包含代码和数据,且被加载到固定位置

– System V UNIX 早期版本:COFF 格式,文件中不仅包含代码和数据,还包含重定位信息、调试信息、符号表等其他信息,由一组严格定义的数据结构序列组成

– Windows:PE 格式(COFF的变种),称为可移植可执行(Portable Executable,简称PE)

– Linux 等类 UNIX:ELF 格式(COFF的变种),称为可执行可链接(Executable and Linkable Format,简称ELF)

ELF 文件即是 Linux 等类 UNIX 上的目标文件

3.1 ELF 文件结构

ELF 文件提供了两种不同的视角,在汇编器和链接器看来,ELF 文件是由 Section Header Table 描述的一系列 Section 的集合,而执行一个 ELF 文件时,在加载器(Loader)看来它是由 Program Header Table 描述的一系列 Segment 的集合。

两种不同的视角对应两种视图,如下所示:

  • 链接视图(被链接):可重定位目标文件

  • 执行视图(被执行):可执行目标文件

常见的 ELF 文件大致结构 如下:

3.1.1 ELF 头部 - ELF Header

ELF 头部(ELF Header):描述整个文件的组织结构。

3.1.2 程序头部表 - Program Header Table

程序头部表(Program Header Table):描述文件中的各种 segments,用来告诉系统如何创建进程映像的。

3.1.3 节区/段区 - Section/segments

节区/段区(Section/segments):segments 是从运行的角度来描述 ELF 文件,sections 是从链接的角度来描述 ELF文件,也就是说,在链接阶段,我们可以忽略 program header table 来处理此文件,在运行阶段可以忽略 section header table 来处理此程序。从图中我们也可以看出,segments 与 sections 是包含的关系,一个s egment 包含若干个 section。

3.1.4 节区头部表 - Section Header Table

节区头部表(Section Header Table):包含了文件各个 section 的属性信息。描述节区的表,每个节区占一个项。

4 查看 ELF 文件内容

4.1 readelf

4.1.1 格式

readelf <option(s)> 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 <number or name> :--hex-dump=<number or name> 以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 宽行输出。

4.2 objdump

https://man.linuxde.net/objdump

5 Shell 筛选符合条件的 ELF 文件 代码

#! /bin/bash

#	功能:检测当前目录下的所有 ELF 文件中是否有敏感字, 将符合条件的 ELF 文件路径存入 result(nm,cat,readelf,objdump)
# 前置条件:
# 当前目录下的 sensitive.txt : 敏感字字典
# 输出:
# ELF : 当前目录下所有 ELF 文件的路径
# result : 含有敏感字的 ELF 文件路径 # 筛选当前目录下所有 ELF 文件,并将文件路径存入 ELF
function findELF
{
now_dir=$(cd $(dirname $0) && pwd) find $now_dir -type f -exec file {} \; | grep "\<ELF\>" | awk -F ':' '{print $1 }' > ELF
} # 通过 cat 查找敏感字,将符合条件的 ELF 文件路径存入 result
function findSensitiveBy_cat
{
cat $1 | while read fileNameLine
do
cat sensitive.txt | while read sensitiveLine
do
if cat $fileNameLine | grep $sensitiveLine
then
printf "cat match sensitivefileName is %s\n" $fileNameLine >> sensitiveResult
#$fileNameLine >> result
fi
done
done
} # 通过 nm 查找敏感字,将符合条件的 ELF 文件路径存入 result
function findSensitiveBy_nm
{
cat $1 | while read fileNameLine
do
cat sensitive.txt | while read sensitiveLine
do
if nm $fileNameLine | grep $sensitiveLine
then printf "nm match sensitivefileName is %s\n" $fileNameLine >> sensitiveResult
# 错误代码 此处会打印出匹配到的字符串 为什么?
#$fileNameLine >> result
fi
done
done
} # 通过 readelf 查找敏感字,将符合条件的 ELF 文件路径存入 result
function findSensitiveBy_readelf
{
cat $1 | while read fileNameLine
do
cat sensitive.txt | while read sensitiveLine
do
if readelf -a $fileNameLine | grep $sensitiveLine
then
printf "readelf match sensitivefileName is %s\n" $fileNameLine >> sensitiveResult
#$fileNameLine > result
fi
done
done
} # 通过 objdump 查找敏感字,将符合条件的 ELF 文件路径存入 result
function findSensitiveBy_objdump
{
cat $1 | while read fileNameLine
do
cat sensitive.txt | while read sensitiveLine
do
if objdump -D $fileNameLine | grep $sensitiveLine
then
printf "objdump match sensitivefileName is %s\n" $fileNameLine >> sensitiveResult
#$fileNameLine > result
fi
done
done
} findELF findSensitiveBy_cat ELF
findSensitiveBy_nm ELF
findSensitiveBy_readelf ELF
findSensitiveBy_objdump ELF

Shell 筛选符合条件的 ELF 文件的更多相关文章

  1. 如何从List<T>中筛选符合条件的数据的集合或个数

    方法一:Linq ChannelList就是一个List类型的数据,IsOpen 是其元素的属性 channelCount = (from channel in DevicesManager.Inst ...

  2. linux查找符合条件的文件并删除

    找到根目录下所有的以test开头的文件并把查找结果当做参数传给rm -rf命令进行删除: 1.find / -name “test*” |xargs rm -rf 2.find / -name “te ...

  3. java删除目录下符合条件的文件

    自己做的一个小程序,目的是:删除某个目录下所有的文件大小为0的文件.同理其他的条件也可以,只需修改delFile()方法中的判断条件即可. 下面是代码,有需要的同学可以参考下,如有错误请指出,不胜感激 ...

  4. Shell面试题8:筛选符合长度的单词案例

    企业Shell面试题8:筛选符合长度的单词案例 利用bash for循环打印下面这句话中字母数不大于6的单词(某企业面试真题). I am oldboy teacher welcome to oldb ...

  5. 批量屏蔽符合条件的IP地址,支持添加白名单,IP段,增量,大于指定次数的IP

    批量屏蔽符合条件的IP地址,支持添加白名单,IP段,增量 大概的思路是利用sh,从日志中提取出来对应的IP地址,然后再交由python进行对比,判断,最终将需要添加至iptables列表中的IP写入到 ...

  6. Shell脚本——make命令和Makefile文件【转】

    https://blog.csdn.net/twc829/article/details/72729799 make命令是一个常用的编译命令,尤其在C/C++开发中,make命令通过makefile文 ...

  7. ARM 之一 ELF文件、镜像(Image)文件、可执行文件、对象文件 详解

    [转]https://blog.csdn.net/ZCShouCSDN/article/details/100048461 ELF 文件规范   ELF(Executable and Linking ...

  8. 【DSP开发】DSP COFF 与 ELF文件

    本文介绍了C6000最新的v7.2或者之后的编译器如何支持ELF(EABI)和COFF-ABI格式,首先由ARM引入嵌入式(Embedded) EABI的介绍,之后比较了COFF-ABI和EABI的区 ...

  9. Shell脚本的条件控制和循环语句

    条件判断:if语句 语法格式: if [ expression ] then Statement(s) to be executed if expression is true fi 注意:expre ...

随机推荐

  1. unity官方案例精讲(第三章)--星际航行游戏Space Shooter

    案例中实现的功能包括: (1)键盘控制飞船的移动: (2)发射子弹射击目标 (3)随机生成大量障碍物 (4)计分 (5)实现游戏对象的生命周期管理 导入的工程包中,包含着一个完整的 _scene--- ...

  2. dockerfile关键字

    DockerFile关键字(保留字指令) FORM:基础镜像,表明当前镜像是基于那么镜像的 MAINTAINER :镜像维护者的名字和邮箱地址 RUN:容器构建时需要用到的命令 EXPOSE:当前容器 ...

  3. 正式班D7

    2020.10.13星期二 正式班D7 一.上节课复习 Linux发展 批处理系统 多道技术 分时操作系统 multics->Unix->minix->Linux(如Redhat.c ...

  4. 多测师讲解python_模块(导入模块和内置模块)_高级讲师肖sir

    #自定义模块# from aaa import * #指定导入某个包中具体的类.函数.方法## A.fun1(2,2) #import +模块名 :# # import +模块名+.+.+# # 导入 ...

  5. 记录一次源码扩展案列——FastJson自定义反序列化ValueMutator

    背景:曾经遇到一个很麻烦的事情,就是一个json串中有很多占位符,需要替换成特定文案.如果将json转换成对象后,在一个一个属性去转换的话就出出现很多冗余代码,不美观也不是很实用. 而且也不能提前在j ...

  6. day58 Pyhton 框架Django 01

    内容回顾 python基础    网路编程    并发编程    数据库    前端     osi7层           tcp/ip 5层模型    应用层    表示层             ...

  7. day43 Pyhton 并发编程06

    一.内容回顾 线程 锁 为什么有了GIL之后还需要锁 多个线程同时操作全局变量还需要锁 当出现'非原子性操作',例如+= -= *= /= l.append(l) 原子性操作 a += 1  a= a ...

  8. 《我想进大厂》之Dubbo普普通通9问

    这是面试专题系列第四篇,Dubbo系列.Dubbo本身并不复杂,而且官方文档写的非常清楚详细,面试中dubbo的问题一般不会很多,从分层到工作原理.负载均衡策略.容错机制.SPI机制基本就差不多了,最 ...

  9. centos8平台:redis6配置启用io多线程(redis6.0.1)

    一,linux平台上redis6的安装 请参见这一篇: https://www.cnblogs.com/architectforest/p/12830056.html 说明:刘宏缔的架构森林是一个专注 ...

  10. 反射(Reflection)

    Java学习笔记--反射(Reflection) 关于反射 能够分析类能力的程序称之为反射(Reflection) 反射机制可以用来: 在运行时分析类的能力 在运行时检查对象,例如:编写一个适合所有类 ...