交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
第二章 ELF文件结构
分享
未结
0
2630
李延
LV6
2022-07-17
悬赏:20积分
# 1 ELF elf是在Linux服务器下的可执行文件,也就是我们c语言编译后最终的二进制文件,它共包括: - 可重定位文件:linux下的.o 文件 - 可执行文件:c语言编译后最终执行的文件,如:linux下的/bin/bash 和win下的.exe - 共享目标文件:Linux下的.so, win 下的dll文件 - 核心存储文件:Linux下的core dump # 2 分析方式 我们首先通过写一个c语言代码,通过gcc 分别将他们编译为 汇编 和ELF 文件。 而后在通过一些工具,比如:objdupm 和hexdupm 分别查看ELF文件的内容,分析这些文件,比如: 我们写一个简单的c语言代码 ```c #include <stdio.h> int main(){ printf("Hello, World!\n"); return 0; } ``` 将它编译为汇编: ```sh gcc -S main.c ``` ```asm .file "main.c" .section .rodata .LC0: .string "Hello, World!" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $.LC0, %edi call puts movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)" .section .note.GNU-stack,"",@progbits ``` 最后我们将它编译为机器码 ```sh gcc -c main.s ``` 这样我们就得到了一个.o 文件,也就是我们想要的ELF文件。 我们的目的,就是分析这个文件的格式。 但因为他是一个二进制文件,无法直接打开,我们需要借助工具查看,如: ```sh hexdump main.o ``` ```sh 0000000 457f 464c 0102 0001 0000 0000 0000 0000 0000010 0001 003e 0001 0000 0000 0000 0000 0000 0000020 0000 0000 0000 0000 02a0 0000 0000 0000 0000030 0000 0000 0040 0000 0000 0040 000d 000c 0000040 4855 e589 00bf 0000 e800 0000 0000 00b8 0000050 0000 5d00 48c3 6c65 6f6c 202c 6f57 6c72 0000060 2164 0000 4347 3a43 2820 4e47 2955 3420 0000070 382e 352e 3220 3130 3035 3236 2033 5228 0000080 6465 4820 7461 3420 382e 352e 342d 2934 0000090 0000 0000 0000 0000 0014 0000 0000 0000 00000a0 7a01 0052 7801 0110 0c1b 0807 0190 0000 00000b0 001c 0000 001c 0000 0000 0000 0015 0000 00000c0 4100 100e 0286 0d43 5006 070c 0008 0000 00000d0 0000 0000 0000 0000 0000 0000 0000 0000 00000e0 0000 0000 0000 0000 0001 0000 0004 fff1 00000f0 0000 0000 0000 0000 0000 0000 0000 0000 0000100 0000 0000 0003 0001 0000 0000 0000 0000 0000110 0000 0000 0000 0000 0000 0000 0003 0003 0000120 0000 0000 0000 0000 0000 0000 0000 0000 0000130 0000 0000 0003 0004 0000 0000 0000 0000 0000140 0000 0000 0000 0000 0000 0000 0003 0005 0000150 0000 0000 0000 0000 0000 0000 0000 0000 0000160 0000 0000 0003 0007 0000 0000 0000 0000 0000170 0000 0000 0000 0000 0000 0000 0003 0008 0000180 0000 0000 0000 0000 0000 0000 0000 0000 0000190 0000 0000 0003 0006 0000 0000 0000 0000 00001a0 0000 0000 0000 0000 0008 0000 0012 0001 00001b0 0000 0000 0000 0000 0015 0000 0000 0000 00001c0 000d 0000 0010 0000 0000 0000 0000 0000 00001d0 0000 0000 0000 0000 6d00 6961 2e6e 0063 00001e0 616d 6e69 7000 7475 0073 0000 0000 0000 00001f0 0005 0000 0000 0000 000a 0000 0005 0000 0000200 0000 0000 0000 0000 000a 0000 0000 0000 0000210 0002 0000 000a 0000 fffc ffff ffff ffff 0000220 0020 0000 0000 0000 0002 0000 0002 0000 0000230 0000 0000 0000 0000 2e00 7973 746d 6261 0000240 2e00 7473 7472 6261 2e00 6873 7473 7472 0000250 6261 2e00 6572 616c 742e 7865 0074 642e 0000260 7461 0061 622e 7373 2e00 6f72 6164 6174 0000270 2e00 6f63 6d6d 6e65 0074 6e2e 746f 2e65 0000280 4e47 2d55 7473 6361 006b 722e 6c65 2e61 0000290 6865 665f 6172 656d 0000 0000 0000 0000 00002a0 0000 0000 0000 0000 0000 0000 0000 0000 * 00002e0 0020 0000 0001 0000 0006 0000 0000 0000 00002f0 0000 0000 0000 0000 0040 0000 0000 0000 0000300 0015 0000 0000 0000 0000 0000 0000 0000 0000310 0001 0000 0000 0000 0000 0000 0000 0000 0000320 001b 0000 0004 0000 0040 0000 0000 0000 0000330 0000 0000 0000 0000 01f0 0000 0000 0000 0000340 0030 0000 0000 0000 000a 0000 0001 0000 0000350 0008 0000 0000 0000 0018 0000 0000 0000 0000360 0026 0000 0001 0000 0003 0000 0000 0000 0000370 0000 0000 0000 0000 0055 0000 0000 0000 0000380 0000 0000 0000 0000 0000 0000 0000 0000 0000390 0001 0000 0000 0000 0000 0000 0000 0000 00003a0 002c 0000 0008 0000 0003 0000 0000 0000 00003b0 0000 0000 0000 0000 0055 0000 0000 0000 00003c0 0000 0000 0000 0000 0000 0000 0000 0000 00003d0 0001 0000 0000 0000 0000 0000 0000 0000 00003e0 0031 0000 0001 0000 0002 0000 0000 0000 00003f0 0000 0000 0000 0000 0055 0000 0000 0000 0000400 000e 0000 0000 0000 0000 0000 0000 0000 0000410 0001 0000 0000 0000 0000 0000 0000 0000 0000420 0039 0000 0001 0000 0030 0000 0000 0000 0000430 0000 0000 0000 0000 0063 0000 0000 0000 0000440 002e 0000 0000 0000 0000 0000 0000 0000 0000450 0001 0000 0000 0000 0001 0000 0000 0000 0000460 0042 0000 0001 0000 0000 0000 0000 0000 0000470 0000 0000 0000 0000 0091 0000 0000 0000 0000480 0000 0000 0000 0000 0000 0000 0000 0000 0000490 0001 0000 0000 0000 0000 0000 0000 0000 00004a0 0057 0000 0001 0000 0002 0000 0000 0000 00004b0 0000 0000 0000 0000 0098 0000 0000 0000 00004c0 0038 0000 0000 0000 0000 0000 0000 0000 00004d0 0008 0000 0000 0000 0000 0000 0000 0000 00004e0 0052 0000 0004 0000 0040 0000 0000 0000 00004f0 0000 0000 0000 0000 0220 0000 0000 0000 0000500 0018 0000 0000 0000 000a 0000 0008 0000 0000510 0008 0000 0000 0000 0018 0000 0000 0000 0000520 0001 0000 0002 0000 0000 0000 0000 0000 0000530 0000 0000 0000 0000 00d0 0000 0000 0000 0000540 0108 0000 0000 0000 000b 0000 0009 0000 0000550 0008 0000 0000 0000 0018 0000 0000 0000 0000560 0009 0000 0003 0000 0000 0000 0000 0000 0000570 0000 0000 0000 0000 01d8 0000 0000 0000 0000580 0012 0000 0000 0000 0000 0000 0000 0000 0000590 0001 0000 0000 0000 0000 0000 0000 0000 00005a0 0011 0000 0003 0000 0000 0000 0000 0000 00005b0 0000 0000 0000 0000 0238 0000 0000 0000 00005c0 0061 0000 0000 0000 0000 0000 0000 0000 00005d0 0001 0000 0000 0000 0000 0000 0000 0000 00005e0 ``` 他每行第一个表示是第几个字符,后面就是文件的具体内容,或者直接用可以打开二进制文件的工具打开。 出来直接查看二进制文件外,还可以通过objdump 反编译工具打开 ```sh objdump -D main.o ``` 这个工具在后面具体使用时介绍。
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号