今天翻翻老本,翻到一款上天入地的神器 —— readelf,据说用它可以拂开云雾,抽丝剥茧,去伪存真,深入其里。它就像一把精工刀,专用于对ELF格式文件进行外科手术般的解剖,今天我们来见识见识。...在Linux中,ELF是标准的可执行文件格式,其全称是Executable and Linkable Format。...readelf还有很多有用的选项,帮助我们更精确理解ELF格式的内在细节,这些用法可以在man手册中查到。
欢迎关注VxWorks567 如转发 请标注出处 据说这个工具可以提供比objdump更详细的信息 Usage: readelf elf-file(s) -h Display...output width to exceed 80 characters @ Read options from -v Display the version number of readelf
今天说一说readelf命令使用说明[通俗易懂],希望能够帮助大家进步!!!...0x1、概述 readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库(*.so)或者静态库(*.a) 等包含ELF格式的文件。...0x2、readelf常用命令 语法:readelf (选项)(参数:文件),除了-v和-H之外,其它的选项必须有一个被指定参数 1、选项 -h(elf header),显示elf文件开始的文件头信息。...18、选项 -v,version 显示readelf的版本信息。 19、选项 -H,help 显示readelf所支持的命令行选项。
readelf 用于显示elf格式文件的信息 补充说明 readelf命令用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。...objdump提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件),所以即使BFD库有什么bug存在的话也不会影响到readelf...运行readelf的时候,除了-v和-H之外,其它的选项必须有一个被指定。...-v 或 --version:显示readelf的版本信息。 -H 或 --help:显示readelf所支持的命令行选项。 -W 或 --wide:宽行输出。...0x000134 0x08048134 0x08048134 0x00013 0x00013 R 0x1 Requesting program interpreter: /lib/[ld-linux.so
之前写了一篇关于linux下常用的几个命令,参考Linux入门--提高工作效率的命令。...接下来接着介绍一些在linux下做开发经常使用到得命令,其中有打包压缩命令tar,文件查找命令find,文件内容查找命令grep,elf可执行文件分析工具readelf等。...1、打包压缩命令tar 在linux下经常会遇到给源码打包解压等,如果你还是用linux的X window来做那你就out了。...查询文件所有信息 readelf object-file-name -a 查询elf header readelf object-file-name -h 查询符号表 readelf object-file-name...-s 查询所有section详细信息 readelf object-file-name -t或者 readelf object-file-name -S dump某个section的信息 readelf
建立软链接 ln -s /lib/ld-linux.so.3 /lib/ld-linux-armhf.so.3 3. 编译程序时,加入-static选项静态链接程序,即不使用动态库 ?...-l helloworld | grep interpreter readelf: Error: 'helloworld': No such file root@tegra-ubuntu:~# readelf...:~# readelf -l b.out | grep interpreter [Requesting program interpreter: /lib/ld-linux.so.3] ?...3 介绍 ld装载器 Linux 使用这个ld-linux.so*(虚拟机x86的ubuntu 是使用ld-linux.so2)中的来装载(其实这只是一个链接)其他库。...所以这个库必须放在 linux中/lib下。对于其他,通常我们共享库放在/lib这个路径下,而且也是系统默认的搜索路径。
如何准确判断so有没有被strip请参照文章下面提到的readelf工具。...-4.9对应的bin文件夹是 /Android/Sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin.../release/0/lib/对应的abi目录 ------------------------分隔符------------------------ 其他工具补充 toolchain下的: arm-linux-androideabi-readelf...被strip的so的 readelf结果里“section headers”的个数会比未strip后的少,所以可以根据readelf来判断so是否是真的被strip了 命令格式: arm-linux-androideabi-readelf...命令格式: arm-linux-androideabi-readelf -a xx.so > fun.txt # 注意:仍需要使用未strip之前的so文件, 上面的命令会把结果写入fun.txt arm-linux-androideabi-objdump
今天我们进行第三课,更深入的了解Linux下程序调试内容 Linux C程序的调试 这里我们会用到一些更高级的工具 objdump objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,...这里注意,不能单独使用-j或者--section 更多的选项可以常见man手册 readelf 这个工具和objdump差不多,但是它显示的信息更为具体,并且它不依赖BFD库 这个程序也是在Ubuntu...显示文件头信息 我们还是用原来那个可执行文件11来做演示 执行 readelf -h 11 结果 ? 2. 显示文件头表信息 readelf -l 11 结果 ? 3....显示所有信息 这个就简单暴力了 readelf -all 11 结果 ? ? ? 等等 这两个命令主要面对的是汇编调试或者二进制分析 下节我们介绍几个文件类型检查和病毒文件测试分析的小技巧命令
:19409) [1] ==5358== by 0x80868EA: process_file (readelf.c:19588) [0] ==5358== by 0x8086B01:...of size 80 free'd ==5358== at 0x402D358: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so...(readelf.c:19588) [0] ==5358== by 0x8086B01: main (readelf.c:19664) // stack trace for the...Block was alloc'd at ==5358== at 0x402C17C: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so...main (readelf.c:19664) 应用场景二:补丁测试 我们使用GNU补丁的CVE-2018-6952来说明产生不同漏洞触发输入以支持漏洞修复过程的重要性。
一、编译环境搭建 ubuntu 20.04 使用 arm-linux-gnueabihf-gcc 7.5.0。...int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } 编译: arm-linux-gnueabihf-gcc...三、readelf 工具 readelf 工具由编译器提供,用来列出关于可执行文件的内容的相关信息。...使用格式如下: Usage: readelf elf-file(s) (1)查看可执行文件的头部 信息 -h:用于列出 ELF 文件的头部信息,包括可执行文件运行的平台、软件版本...将可执行文件的所有 section header 集合到一起就是 section header table,使用 readelf 的 -S 参数查看的就是该表。
要想在Linux系统上开发或研究木马病毒等特殊程序,我们需要使用一系列强大的开发和调试攻击。本节先介绍几种在Linux系统上极为强大的工具。...第一个当然是gdb了,在Linux上,它是唯一能用于程序调试的利器。...; } 然后使用gcc编译成可执行文件,命令如下: gcc -Wall -g hello_world.c -o hello_world 注意到gcc也是在Linux上进行程序开发必不可少的编译器...如果要分析ELF可执行文件格式内容,一个必不可免的工具为readelf,它能有效读取elf文件内各种关键信息。该工具在后续章节中将会被大量使用。几个常用方法为: readelf - S ....readelf -s ./sys_read 该命令读取可执行文件的符号表。 readelf -r ./sys_read 该命令读取可执行文件的重定向入口。
我们将使用readelf命令读取ELF。...让我们从查看以下内容的ELF标头开始分析main: $ readelf -h main ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00...直接依赖 我们可以使用readelf实用工具来进一步探索.dynamic可执行文件的部分。 特别是,本节包含我们ELF文件的所有动态依赖项。.../tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86..._64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_
来源:公众号【编程珠玑】 作者:守望先生 网站:https://www.yanbinghu.com 前言 在Linux中,可执行文件的格式是ELF格式,而有一些命令可以帮助我们了解它们更多的“秘密”,以此来帮助我们解决问题...查看ELF头 readelf用于查看ELF文件,而: $ readelf -h hello ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00...例如你在x86的机器上交叉编译出powerpc的可执行文件,在powerpc上却不被识别,不能运行,不如用readelf看看它的Machine字段,是不是没有编译好。...不如看看它链接了哪些库吧: $ ldd hello linux-vdso.so.1 => (0x00007ffd16386000) libc.so.6 => /lib/x86_64-linux-gnu.../x86_64-linux-gnu/libc.so.6,而如果该文件不存在,则运行时将会出错。
================================ [2021-07-24 14:50:19][PID:8229] [|- locate ] locate libm.so readelf...-h /lib/x86_64-linux-gnu/libm.so.6 共享目标文件 [2021-07-24 14:50:19][PID:8229] [静态链接] gcc -static -o...14:50:19][PID:8229] [动态链接 (默认)] gcc -o main main.c -lm #默认使用的是动态链接 gcc -c main.c #生成可重定位目标文件(readelf...-h main.o ) gcc -o main main.o -lm (链接 libm.a or libm.so, 一定要放最后面,先提取未知的符号,再在库中 查找 符号定义) readelf
字符对应的 ASCII 码 ; 而节头表SHT(section_header_table ) 和 程序头表PHT(program_header_table) 的偏移地址也显示出来了~ 运行命令: arm-linux-androideabi-readelf...没关系,我也是,先了解大概意思,慢慢往下走~ 运行命令: arm-linux-androideabi-readelf -S xxx.so 2.2、 ELF中程序头表是什么北北呢?...比如我们看setopt函数这个重定位入口,它的类型为R_AARCH64_JUMP_SL,它的偏移为0x000000066400,它实际上位于.got中 运行命令: arm-linux-androideabi-readelf...come on~ 1、 .dynsym检索 .dynsym:在之前的描述中,这个节里只保存了与动态链接相关的符号导入导出 我们先来找到自定义的目标函数curl_a_website: 运行命令: arm-linux-androideabi-readelf...运行命令: arm-linux-androideabi-readelf -r xxx.so 其中,我们可以看到 curl_a_website 的偏移是 0x3070 ,那么得到了偏移值,基址怎么确定呢
我们往往可以用这个命令来查看一个可执行文件所需要的动态链接器的路径,在linux下,往往是这个结果: readelf -l a.out | grep interpreter [Requeseting...program interpreter: /lib/ld-linux.so.2] 而当我们在FreeBSD 4.6.2 下执行这个命令时,结果是: readelf -l a.out | grep interpreter...64 位的linux下的可执行文件是: readelf -l a.out | grep interpreter 2. “.dynamic”段 类似于“.interp”这样的段,ELF中还有几个段也是专门用于动态链接的...使用readelf工具可以查看 ".dynamic" 段的内容 $ readelf -d lib.so ? ? 另外linux还提供了一个命令用来查看一个程序主模块或一个共享库依赖于哪些共享库: ?...我们可以用readelf工具来查看elf文件的动态符号表及哈希表: readelf -sD lib.so ?
我们可以通过 readelf 命令查看可执行文件的 ELF 头,如下: ➜ kind git:(master) ✗ readelf -h ....这里的取值同样可以在 Linux 内核源码[3]中找到: // include/uapi/linux/elf.h#L347-L349 #define ELFCLASSNONE 0 /* EI_CLASS...➜ kind git:(master) ✗ readelf -l ....➜ kind git:(master) ✗ readelf -S ....https://github.com/torvalds/linux/blob/2c85ebc57b3e1817b6ce1a6b703928e113a90442/include/uapi/linux/elf.h
Linux一般程序的入口是__start函数,程序有两个相关的段: init段:进程的初始化代码,一个程序开始运行时,在main函数调用之前,会先运行.init段中的代码。..."); SEARCH_DIR("=/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr.../test hello 上面的tinytext一行是指将.text段、.data段、.rodata段的内容都合并到tinytext段中,使用readelf查看段的信息。...~/test$ readelf -S test ~/test$ There are 6 section headers, starting at offset 0x482a0: Section Headers...-h 列出文件头 readelf -S 列出每个段 readelf -r 列出重定位表 readelf -d 列出动态段 关于查看目标文件符号信息: nm -a 显示所有的符号 nm -D 显示动态符号
我们通过readelf -l [fileName]可以直接查看到程序头表。...总体来说,在程序加载过程中,磁盘上的可执行文件,进程的虚拟地址空间,还有机器的物理内存的映射关系如下: Linux下的装载过程 接下来我们进一步探究一下Linux是怎么识别和装载ELF文件的,我们需要深入...Linux内核去寻找答案 (内核实际处理过程涉及更多的过程,我们这里主要关注和ELF文件处理相关的代码)。...我们通过readelf来查看a.out文件的信息: readelf -h a.out 输出: 我们这里看到,程序的入口地址是:Entry point address: 0x400a80。...动态链接的实现机制 程序头表 我们同样用readelf -l [fileName]来查看动态链接的可执行ELF文件的程序头表: readelf -l a.out 可以看到编译完成之后地址是从 0x00000000
ELF文件中各个结构体的内容,我们可以看源码中如下路径: platform/external/kernel-headers /original/uapi/linux/elf.h 下面来逐步解析这个...工具解析ELF 这边常用的是readelf,这个工具运行在linux下的。...一般运行的时候readelf –help,就可 以看到命令可以带什么参数,参数的含义等, 以下列出常用的几个: A. readelf –h xxx.so 查看elf的头部信息...B. readelf –S xxx.so 查看elf节头信息 C. readelf –l xxx.so 查看elf段头信息 四. so文件加载 1.
领取专属 10元无门槛券
手把手带您无忧上云