一、首先看一下几个常用参数的基本含义:

objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它还有其他作用,下面以ELF格式可执行文件test为例详细介绍:

1、objdump -f test       显示test的文件头信息

2、objdump -d test       反汇编test中的需要执行指令的那些section

3、objdump -D test       与-d类似,但反汇编test中的所有section

4、objdump -h test       显示test的Section Header信息

5、objdump -x test      显示test的全部Header信息

6、objdump -s test       除了显示test的全部Header信息,还显示他们对应的十六进制文件代码

二、接着看一段程序:

int printf(const char* fromat,...);
int global_init_var=84;
int global_uninit_var; void func1(int i)
{
printf("%d\n,i");
} int main()
{
static int static_var=85;
static int static_var2;
int a=1;
int b;
func1(static_var+static_var2+a+b);
return a;
}

一、gcc -c SimpleSection.o

1、利用objdump -h命令将SimpleSection.o这个ELF文件的各个段基本信息打印出来,如下:

Sections:
Idx Name                         Size               VMA                         LMA                    File off     Algn
  0 .text                         0000004f  0000000000000000  0000000000000000  00000040  2**0
                                    CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data                        00000008  0000000000000000  0000000000000000  00000090  2**2
                                     CONTENTS, ALLOC, LOAD, DATA
  2 .bss                         00000004  0000000000000000  0000000000000000  00000098  2**2
                                    ALLOC
  3 .rodata                    00000006  0000000000000000  0000000000000000  00000098  2**0
                                   CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .comment               0000002e  0000000000000000  0000000000000000  0000009e  2**0
                                   CONTENTS, READONLY
  5 .note.GNU-stack     00000000  0000000000000000  0000000000000000  000000cc  2**0
                                   CONTENTS, READONLY
  6 .eh_frame                00000058  0000000000000000  0000000000000000  000000d0  2**3
                                    CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
 
       除了基本的代码段、数据段(初始化的全局变量与局部静态变量)、BSS段(未初始化的全局变量和未初始化的局部静态变量)之外,还有之都数据段(.rodata),注释信息段(.comment),堆栈提示段(.note.GNU-stack),调试信息段(.eh_frame)。
其中Size表示该段的大小, File off表示段所在位置(距离ELF Header 00000000)的偏移。 CONTENTS, ALLOC等表示各段的属性。CONTENTS表示该段在文件中存在,BSS段
其实在ELF中不存在内容。
 
2、利用objdump -x可以查看更多更详细的信息:(但是最详细的信息可以参见 readelf -a 命令)
SimpleSection.o:     file format elf64-x86-64
SimpleSection.o
architecture: i386:x86-64, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x0000000000000000 Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000054 0000000000000000 0000000000000000 00000040 2**0
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000008 0000000000000000 0000000000000000 00000094 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000004 0000000000000000 0000000000000000 0000009c 2**2
ALLOC
3 .rodata 00000004 0000000000000000 0000000000000000 0000009c 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .comment 0000002e 0000000000000000 0000000000000000 000000a0 2**0
CONTENTS, READONLY
5 .note.GNU-stack 00000000 0000000000000000 0000000000000000 000000ce 2**0
CONTENTS, READONLY
6 .eh_frame 00000058 0000000000000000 0000000000000000 000000d0 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
SYMBOL TABLE:
0000000000000000 l df *ABS* 0000000000000000 SimpleSection.c
0000000000000000 l d .text 0000000000000000 .text
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 l d .bss 0000000000000000 .bss
0000000000000000 l d .rodata 0000000000000000 .rodata
0000000000000004 l O .data 0000000000000004 static_var.1730
0000000000000000 l O .bss 0000000000000004 static_var2.1731
0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack
0000000000000000 l d .eh_frame 0000000000000000 .eh_frame
0000000000000000 l d .comment 0000000000000000 .comment
0000000000000000 g O .data 0000000000000004 global_init_var
0000000000000004 O *COM* 0000000000000004 global_uninit_var
0000000000000000 g F .text 0000000000000021 func1
0000000000000000 *UND* 0000000000000000 printf
0000000000000021 g F .text 0000000000000033 main RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
0000000000000011 R_X86_64_32 .rodata
000000000000001b R_X86_64_PC32 printf-0x0000000000000004
0000000000000032 R_X86_64_PC32 .data
0000000000000038 R_X86_64_PC32 .bss-0x0000000000000004
000000000000004b R_X86_64_PC32 func1-0x0000000000000004 RELOCATION RECORDS FOR [.eh_frame]:
OFFSET TYPE VALUE
0000000000000020 R_X86_64_PC32 .text
0000000000000040 R_X86_64_PC32 .text+0x0000000000000021
 
二、gcc -g  -c SimpleSection -o SimpleSection.o
 增加了调试信息:
那么objdump -h SimpleSection.o  会多出很多调试信息段。
 
SimpleSection.o:     file format elf64-x86-64

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000054 0000000000000000 0000000000000000 00000040 2**0
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000008 0000000000000000 0000000000000000 00000094 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000004 0000000000000000 0000000000000000 0000009c 2**2
ALLOC
3 .rodata 00000004 0000000000000000 0000000000000000 0000009c 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .debug_info 000000ed 0000000000000000 0000000000000000 000000a0 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
5 .debug_abbrev 00000091 0000000000000000 0000000000000000 0000018d 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_aranges 00000030 0000000000000000 0000000000000000 0000021e 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
7 .debug_line 0000004a 0000000000000000 0000000000000000 0000024e 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
8 .debug_str 000000ac 0000000000000000 0000000000000000 00000298 2**0
CONTENTS, READONLY, DEBUGGING
9 .comment 0000002e 0000000000000000 0000000000000000 00000344 2**0
CONTENTS, READONLY
10 .note.GNU-stack 00000000 0000000000000000 0000000000000000 00000372 2**0
CONTENTS, READONLY
11 .eh_frame 00000058 0000000000000000 0000000000000000 00000378 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
我们可以用 strip 命令去除调试信息,在发布版本。

binary hacks读数笔记(objdump命令)的更多相关文章

  1. binary hacks读数笔记(readelf命令)

    可以用readelf命令来查看elf文件内容,跟objdump相比,这个命令更详细. 1. readelf -h SimpleSection.o ELF Header: Magic: 7f 45 4c ...

  2. binary hacks读数笔记(nm命令)

    nm命令(names):输出包含三个部分:1 符号值.默认显示十六进制,也可以指定: 2 符号类型.小写表示是本地符号,大写表示全局符号(external); 3 符号名称. 例如:nm Simple ...

  3. binary hacks读数笔记(od命令)

    Linux od命令用于输出文件内容. od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来 -t<输出格式>或--format=<输出格式> 设置输出格式. 实例 ...

  4. binary hacks读数笔记(file命令与magic file)

    file命令的作用是用于检验文件的类型,并打印至终端.file命令检验文件类型按以下顺序来完成: 检验文件系统(Filesystem)中支持的文件类型. 检验magic file规则. 检验文件内容的 ...

  5. binary hacks读数笔记(ld 链接讲解 二)

    这块将介绍一下ld链接命令的具体使用.ld的作用:ld是GNU binutils工具集中的一个,是众多Linkers(链接器)的一种.完成的功能自然也就是链接器的基本功能:把各种目标文件和库文件链接起 ...

  6. binary hacks读数笔记(readelf基本命令)

    一.首先对readelf常用的参数进行简单说明: readelf命令是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用,下面以ELF格式可执行文件test为例详细介绍: 1. ...

  7. binary hacks读数笔记(ld 链接讲解 一)

    首先我们先看两段代码: a.c extern int shared; int main(){ int a=100; swap(&a,&shared); } b.c int shared ...

  8. binary hacks读数笔记(共享库)

    共享库从文件结构上来讲,与共享对象没什么区别.Linux下,共享库就是普通的ELF共享对象. 1.共享库命名: libname.so.x.y.z :其中最前面使用前缀lib,中间是库的名字和后缀&qu ...

  9. binary hacks读数笔记(装载)

    1.地址空间 在linux系统中,每个进程拥有自己独立的虚拟地址空间,这个虚拟地址空间的大小是由计算机硬件决定的,具体地说,是由CPU的位数决定的.比如,32位硬件平台决定的虚拟地址空间大小:0--2 ...

随机推荐

  1. .NET Core+MongoDB集群搭建与实战

    目录 安装 MongoDB apt 直接安装(方法1) apt 仓库安装(方法2) 方法1.2启动 MongoDB 通过二进制包安装(方法3) 安装依赖 deb 安装 MongoDB tgz 安装 M ...

  2. spring boot:使mybatis访问多个druid数据源(spring boot 2.3.2)

    一,为什么要使用多个数据源? 1,什么情况下需要使用多个数据源? 当我们需要访问不同的数据库时,则需要配置配置多个数据源, 例如:电商的业务数据库(包括用户/商品/订单等)            和统 ...

  3. 【API管理 APIM】APIM中对后端API服务的DNS域名缓存问题

    问题描述 在使用API Management来进行API管理时,当我们后端的API DNS IP地址发生改变或者是API的域名发生改变后,通过APIM请求访问的还是是旧的域名或者IP地址,这是因API ...

  4. C#文件反序列化

    前言 最近,为了实现Unity游戏数据的加密,我都把注意力放到了C#的加密方式身上,最简单的莫过于C#的序列化了,废话不多说,直接开始 准备工作 在使用文件反序列化前我们得先引用命名空间 using ...

  5. 记一次flink入门学习笔记

    团队有几个系统数据量偏大,且每天以几万条的数量累增.有一个系统每天需要定时读取数据库,并进行相关的业务逻辑计算,从而获取最新的用户信息,定时任务的整个耗时需要4小时左右.由于定时任务是夜晚执行,目前看 ...

  6. buuctf-misc [BJDCTF2020]认真你就输了

    下载压缩包,打开发现有一个10.xls打开一乱码,发现不了头绪,但是发现了pk开头 那我们能不能将这个.xls改成.zip 说干就干,于是我们改成zip解压 打开xl,然后再打开 在chars中发现f ...

  7. linux mount 挂载提示 mount: you must specify the filesystem type

    解决方法: mkfs.ext3 /dev/vdv mount -t ext3 /dev/vdv /usr1

  8. C2. Power Transmission (Hard Edition) 解析(思維、幾何)

    Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...

  9. 基于gin的golang web开发:模型绑定

    在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...

  10. 什么是SOAP?SOAP有什么用?什么时候会用到SOAP?

    什么是SOAP SOAP(Simple Object Access Protocol)一般指简单对象访问协议,简单对象访问协议是交换数据的一种协议规范,是一种轻量的.简单的.基于XML(标准通用标记语 ...