解析目标文件内容:举例说明
cpp
//root@ubuntu:/mnt/hgfs/share/019-proself/04# cat simplesection.c
int printf(const char* format,...);
int global_init_var=84;
int global_uninit_val;
void func1(int i)
{
printf("%d\n",i);
}
int main(void)
{
static int static_var = 85;
static int static_var2;
int a=1;
int b;
func1(static_var + static_var2 + a + b);
return a;
}
1、文件格式有哪些?
2、ELF文件类型有几种类型?
(1)可重定位文件.o
(2)可执行文件
(3)共享目标文件
(4)核心转储文件(Linux下的core dump文件)
3、如何查看文件类型---file命令
4、目标文件的基本框架
(1)虚拟空间的映射关系
(2)objdump -h 查看文件总共的段以及偏移
注意:bss段并不占文件的空间。
(3)接下来分析代码段
从objdump -h查看文件段空间知道,text的偏移和大小,
objdump -s 查看段内容
objdump -d 查看段反汇编
(4)数据段
①.data段存放了初始化的全局变量和局部静态变量。
②printf的时候用到了字符串常量"%d\n",存放在.rodata
③小端存储0x54
④强符号和弱符号概念
(5)bss段
存放未初始化的全局变量和局部静态变量。准确的将是.bss段为他们预留空间。我们只能通过符号表查看,使用objdump -s打印所有段的内容无法查看,以为不在文件中存放。
问题:从代码来看bss,应该有3个整形数
(7)常见的其他短分析
root@ubuntu:/mnt/hgfs/share/019-proself/04# objdump -h /bin/ls /bin/ls: file format elf32-i386 Sections: Idx Name Size VMA LMA File off Algn 0 .interp 00000013 08048154 08048154 00000154 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 1 .note.ABI-tag 00000020 08048168 08048168 00000168 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 2 .note.gnu.build-id 00000024 08048188 08048188 00000188 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 3 .gnu.hash 0000006c 080481ac 080481ac 000001ac 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .dynsym 00000820 08048218 08048218 00000218 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 5 .dynstr 000005d5 08048a38 08048a38 00000a38 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 6 .gnu.version 00000104 0804900e 0804900e 0000100e 2**1 CONTENTS, ALLOC, LOAD, READONLY, DATA 7 .gnu.version_r 000000c0 08049114 08049114 00001114 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 8 .rel.dyn 00000038 080491d4 080491d4 000011d4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 9 .rel.plt 00000380 0804920c 0804920c 0000120c 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 10 .init 00000023 0804958c 0804958c 0000158c 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 11 .plt 00000710 080495b0 080495b0 000015b0 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 12 .text 0001078c 08049cc0 08049cc0 00001cc0 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 13 .fini 00000014 0805a44c 0805a44c 0001244c 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 14 .rodata 000040a8 0805a460 0805a460 00012460 2**5 CONTENTS, ALLOC, LOAD, READONLY, DATA 15 .eh_frame_hdr 00000744 0805e508 0805e508 00016508 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 16 .eh_frame 00002f34 0805ec4c 0805ec4c 00016c4c 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 17 .init_array 00000004 08062ef8 08062ef8 00019ef8 2**2 CONTENTS, ALLOC, LOAD, DATA 18 .fini_array 00000004 08062efc 08062efc 00019efc 2**2 CONTENTS, ALLOC, LOAD, DATA 19 .jcr 00000004 08062f00 08062f00 00019f00 2**2 CONTENTS, ALLOC, LOAD, DATA 20 .dynamic 000000f8 08062f04 08062f04 00019f04 2**2 CONTENTS, ALLOC, LOAD, DATA 21 .got 00000004 08062ffc 08062ffc 00019ffc 2**2 CONTENTS, ALLOC, LOAD, DATA 22 .got.plt 000001cc 08063000 08063000 0001a000 2**2 CONTENTS, ALLOC, LOAD, DATA 23 .data 00000160 080631e0 080631e0 0001a1e0 2**5 CONTENTS, ALLOC, LOAD, DATA 24 .bss 00000c54 08063340 08063340 0001a340 2**5 ALLOC 25 .gnu_debuglink 00000008 00000000 00000000 0001a340 2**0 CONTENTS, READONLY
5、为什么需要把数据段和指令分开存放?
(1)权限问题,代码段只读
(2)现代cpu缓存有数据缓存和指令缓存
(3)为了实现多进程共享指令和共享数据
6、反过来分析elf的文件头
ELF头定义的结构体:
7、分析段表
①利用readelf -S 查看段表
②段的类型
8、重定位表
对于每一个需要重定位的代码段和数据段,都需要一个对应的重定位表。因为text中使用了printf函数,需要访问绝对地址。而.data中,没有绝对地址的引用,它只包含了几个常量。
9、字符串表