目标文件里面到底有什么(2)?

转自:http://blog.csdn.net/shenziheng1/article/details/52719218

前面对于目标文件只是做了概念上的阐述,如果不彻底深入目标文件的具体细节,这样的分析就是泛泛而谈没有意义,也没有深入的理解。就象知道TCP/IP协议是基于包的结构,但是从来没有看到过包的结构是什么样的(说得好像就是我),包的头部有哪些内容?目标地址和源地址是怎样存放的?如果不能细致且深入的去了解,就会步入一个误区:很多问题其实在表面上看似很简单,实际深入内部会发现很多鲜为人知的秘密,或者发现以前自己认为理所当然的东西居然是错误的!!!我需要做的,就是改变这个现状!

1.挖掘SimpleSection.o中的信息

  1. <span style="font-size:18px;">/* 
  2.  *SimpleSection.c 
  3.  * 
  4.  *linux: 
  5.  *  gcc  -c  SimpleSection.c 
  6.  * 
  7.  *Windows: 
  8.  *  cl SimpleSection.c /c /Za 
  9.  */  
  10. int printf(const char* format, ...);  
  11. int global_init_var = 84;  
  12. int global_uninit_var;  
  13.   
  14. void func1(int i)  
  15. {  
  16.     printf("%d\n",i);  
  17. }  
  18. int main(void)  
  19. {  
  20.     static int static_var = 85;  
  21.     static int static_var2;  
  22.     int a = 1;  
  23.     int b;  
  24.       
  25.     func1(static_var + static_var2 + a + b);  
  26.     return a;  
  27. }</span>  
利用GCC对源文件进行编译可以得到目标文件:
  1. <span style="font-size:18px;">$ gcc -c SimpleSection.c</span>  
查看目标文件中的内容如下:
从上面的结果中,我们能够看到:SimpleSection.o中的段的数量比我们想象中的要多,除了最基本的代码段、数据段和BSS段以外,还有3个段分别是只读数据段(.rodata)、注释信息段(.comment)、堆栈提示段(.note.GNU-stack)。先不考虑这三个额外的段。想了解一下关于段的几个重要的属性,首先最容易理解的就是段的长度(Size)和段所在的位置(File Offset),每个段中的第二行“CONTENTS”/"ALLOC"等表示的就是段的各种属性。“CONTENTS”表示该段在文件中是存在的。我们能够发现在BSS段中是没有“CONTENTS”的,这表示它实际上在EFL文件中根本不存在内容。所以,在EFL文件中实际存在的也就是“.text”、".data"、“.comment”、“.rodata”这4个段了。对于本项目,他们在ELF中的结构如下图所示:

代码段
将所有段的内容以十六进制的形式打印,并对所有包含指令的段进行反汇编,得到以下结果:


“Contents of Section  .text”就是.text的数据以十六进制方式打印出来的内容,总共0x5b字节,跟前面我们了解到的".text"段中的长度相一致。最左面一列指的是偏移量,中间四列指的是十六进制内容,最后一列是该段的ASCII码形式。
对照下面反汇编的结果,我们可以很明显的看到,.text段里所包含的正是SimpleSection.c里面两个函数func1()和main()函数的指令。
数据段与只读数据段
.data段保存的是那些已经初始化了的全局静态变量或局部静态变量。前面的SimpleSection.c代码中一共有两个这样变量,分别是global_init_var和static_var。这两个变量每一个都是4个字节,总共八个字节,所以“.data”这个段的大小为8个字节。
“.rodata”中只存放只读数据。本例中存放的就是字符串常量,刚好是4个字节。单独设立“.rodata”段有很多好处,不管是在语义上支持了C++的const关键字,而且操作系统自加载时可以将“.rodata”段的属性映射为只读,这样对于这个段的任何修改操作都会作为非法操作处理,大大保证了程序的安全性。
BSS段
.bss段存放的是未初始化的全局变量和局部静态变量。如示例代码中,global_uninit_var和static_var就是被存放在.bss段,其实更准确的说法是,.bss段为他们预留了空间。
其他段
除了.data、.text、.bss这3个最常用的段之外,ELF文件也有可能包含其他的段,用来保存与程序相关的其他信息。具体如下表所示:

这些段的名字都是由"."作为前缀,表示这些表的名字是系统保留的,应用程序也可以使用一些非系统保留的名字作为段名。如我们可以在ELF文件结构中插入一个“music”段,里面存放一首MP3,当ELF文件结构运行起来以后可以读取这个段并播放该首歌。但是,应用程序自定义的段名不能使用"."作为前缀,否则容易与系统保留段名冲突

2.ELF文件结构描述


其实,通过上面的SimpleSection.o实例,我们已经基本了解到了ELF文件的轮廓,下面我们可以正式地看一下ELF的文件总体结构。如下图所示:


ELF目标文件格式的最前部是ELF文件头(File Header),它包含了描述整个文件的基本属性,比如ELF文件版本、目标机器型号、程序入口地址等。紧接着是ELF文件各个段。其中,ELF文件中与段有关的重要结构就是段表(Section Header Table),该表描述了ELF文件中语段有关的所有段的信息,比如每个段的段名、段的长度、在文件中的偏移、读写权限以及其他属性。本处,仅想详细讨论一下符号表的作用,以为他和程序的链接有着很大的关联。
连接的接口——符号

链接过程的本质就是要把多个不同的目标文件之间相互关联到一起。为了使不同目标文件之间能够在相互粘合,这些目标文件之间必须有固定的规则才可以。在链接中,目标文件之间相互拼接实际上是目标文件地址间的相互引用,即对函数以及变量的地址进行引用。比如目标文件B要用到目标文件A中的函数“foo”,那么我们就成目标文件A定义了函数“foo”,称目标文件B引用了目标文件A中的函数“foo”。在链接中,我们将函数以及变量都通称为符号,函数名或者变量名就是符号名
我们可以将符号看作是链接中的黏合剂,整个连接过程正是基于符号才能正常地完成。链接过程中很重要的一环就是符号的管理,每一个目标文件都会有一个相应的符号表,这个表里面记载着目标文件中所有要用的到的符号,每一个定义的符号有一个对应的值,叫做符号值。对于变量以及函数而言,符号值就是他们的地址。除了函数和变量之外,也会存在其他几种不常用的符号,如下面所示:

3.调试信息

目标文件里面还有可能包含调试信息。几乎所有现代的编译器都支持源代码级的调试(比如我们可以在函数里面设置断点、可以监视变量变化、可以单步执行等),前提是编译器必须提前将源代码与目标代码之间的关系(比如目标代码中的地址对应源代码中哪一行?函数和变量的类型?结构体的定义?字符串保存到那个文件里面?)。设置有些高级的编译器或调试器支持查看STL容器中的相关内容。

### 回答1: Metasploit 是一个开源的安全研究和渗透测试平台,它拥有一个非常丰富的模块库,允许研究人员和攻击者以编程方式构建和部署自定义攻击。文件夹里包含有 Metasploit 模块、控制台、漏洞利用代码和报告等内容。功能包括漏洞扫描、系统渗透、攻击自动化和数据恢复等。 ### 回答2: Metasploit是一款开源的渗透测试框架,由Rapid7公司维护和开发。它为安全研究人员、渗透测试人员和安全专家提供了一套强大的工具集,可用于漏洞测试、渗透测试和恶意软件分析。 在Metasploit的文件夹里,包含了各种模块和脚本文件。这些文件包括exploits(漏洞利用脚本)、payloads(载荷,用于在目标系统上执行特定动作)、auxiliary(辅助模块)、post(后渗透模块)、encoders(编码器,用于绕过安全机制)等。 Metasploit的功能非常丰富。首先,它提供了大量的漏洞利用模块,可以帮助使用者在系统中找到和利用安全漏洞。其次,Metasploit具备自动化能力,可以对目标系统进行自动化扫描和利用,提高渗透测试的效率。同时,Metasploit还支持定制化和扩展,用户可以根据需要开发自己的模块。此外,Metasploit还提供了详细的报告和日志功能,帮助用户记录和分析渗透测试结果。 总的来说,Metasploit是一款功能强大、灵活性高的渗透测试框架,通过提供一系列工具和模块,帮助安全专家发现和利用系统中的漏洞,以提高系统的安全性。 ### 回答3: Metasploit是一款广泛使用的开源漏洞利用工具集,它包含了大量的攻击模块和漏洞利用代码。 在Metasploit的文件夹中,通常包含以下内容: 1. modules目录:该目录包含了各种攻击模块,比如exploits、payloads和auxiliary模块等。这些模块可以帮助渗透测试人员或骇客发现系统漏洞,并利用它们进行攻击或搜集信息。 2. scripts目录:该目录包含了一些自定义的脚本文件,这些脚本可以扩展Metasploit的功能,并提供更多的自动化功能和易用性。 3. tools目录:该目录包含了一些辅助工具和脚本,用于配合Metasploit进行漏洞利用和攻击。 4. data目录:该目录包含了一些数据文件,用于存储Metasploit的配置文件、日志和报告等。 Metasploit的主要功能包括: 1. 漏洞利用:Metasploit提供了大量的漏洞利用模块,用户可以根据目标系统的漏洞情况,选择合适的模块进行攻击。这些模块可以自动化执行恶意代码或命令,并获取对目标系统的控制权。 2. 渗透测试:Metasploit被广泛应用于网络渗透测试,可以帮助渗透测试人员发现并利用系统漏洞,从而评估目标系统的安全性,并提供相应的修复建议。 3. 威胁情报:Metasploit还可以用于搜集和分析威胁情报,通过对各种漏洞数据和攻击模块进行分析,可以帮助安全团队了解当前的网络威胁情况,并采取相应的防护措施。 总之,Metasploit是一款功能强大的漏洞利用工具集,可以帮助安全专业人员进行渗透测试、漏洞利用和威胁情报分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值