ELF文件格式在IDA中解析

一.ELF文件在IDA中展现形式

ELF文件本身是一个二进制文件,对应IDA中 HEX VIEW 界面中内容,但用户关注更多的内容可能是 IDA VIEW。IDA VIEW中是对 HEX VIEW 界面中内容从头到尾的解析,并且内容一一对应(HEX VIEW内容偏移和IDA VIEW的左侧地址对应,不管鼠标在IDA VIEW还是HEX VIEW的哪个位置停留,点击进另一个界面时,地址或偏移都是对应的)。不管二进制文件有多大,解析的汇编内容都只是在IDA VIEW,只是文件很大时,解析会比较慢。

如果二进制内容是文件头或节头或程序头,IDA VIEW中会以从LOAD段解析ELF文件,或是字符串或是顺序排列形式呈现,直到.plt节或.text节,IDA VIEW中开始以汇编代码的形式呈现。
在这里插入图片描述
在这里插入图片描述

IDA解析ELF格式时,会同时参考节头表和程序头(段)表。如果将节头表内容抹除或改偏移让IDA解析不到节表时,IDA VIEW会完全根据LOAD段来解析内容,原先现实的节全部变成LOAD。如果将程序头表内容抹除或改偏移让IDA解析不到程序头表时,IDA VIEW只会解析节表的内容,正常情况下的LOAD段那一部分内容不会在IDA VIEW和HEX VIEW中出现。

二.ELF各节表含义

1.节名称信息

IDA没有展示elf文件所有节的内容,在IDA中使用Ctrl + s可显示节表名称等信息,如下图:
在这里插入图片描述
而elf中所有的节表,如下图:
在这里插入图片描述

2.节对应的功能

.text: 该节中包含程序的指令代码;
.init: 该节包含进程初始化时要执行的程序指令;当程序开始运行时,系统会在进程进入主函数之前先执行这一个节中的指令代码;
.fini: 该节中包含进程终止时要执行的指令代码;当程序退出时,系统会执行这个节中的指令代码;
.bss : 该节中包含目标文件中未初始化的全局变量;一般情况下,可执行程序在开始执行时,系统会把这一段内容清零;但是在运行期间的.bss段是由系统动态初始化而成的,目标文件中的.bss节中并不包含任何内容,其长度为0,所以它的节类型为SHT_NOBITS;
.data:这两个节用于存放程序中已被初始化过的全局变量;在目标文件中,它们是要占用实际的存储空间的,这一点与.bss节不同;如果全局变量是整形,类似下图,则该全局变量的值是0x64(100):
在这里插入图片描述
.rodata:这两个节中包含程序中的只读数据,例如函数体内,只读的字符串会存储在该节中;
.dynamic: 该节中包含动态链接信息,并且可能有SHF_ALLOC和SHF_WRITE等属性;
.dynstr : 该节中包含用于动态链接的字符串,一般是那些与符号表相关的动态符号的名字;
.dynsym : 该节中包含动态链接符号表;
.got : 该节中包含全局偏移表(global offset table),存放的是类似相对_GLOBAL_OFFSET_TABLE_的偏移;
.plt : 该节中包含函数链接表(program link table);
.hash : 该节中包含一张哈希表,用于动态段中查找动态符号;
.interp : 该节中包含ELF文件解析器的路径名;如果该节被包含在某个可装载的段中,那么该节的属性中应设置SHF_ALLOC标志位;
.strtab : 该节用于存放字符串,主要是那些符号表项的名字;如果一个目标文件中有一个可装载的段,并且其中含有符号表,则该节的属性中应该有SHF_ALLOC属性;
.symtab : 该节用于存放符号表;如果一个目标文件中有一个可装载的段,并且其中含有符号表,则该节的属性中应该有SHF_ALLOC属性;
.shstrtab: 该节是节名字表,含有所有其它节的名字;
.comment: 该节中包含版本控制信息;
.line : 该节中包含调试信息,包括哪些调试符号的行号,为程序指令码与源文件的行号建立联系;
.note : 该节中包含注释;
rel.dyn节的每个表项对应了除了外部过程调用的符号以外的所有重定位对象,
.rel.plt节的每个表项对应了所有外部过程调用符号的重定位信息。

三.IDA使用的一些快捷键记录

1.快捷键

1)D:Options——Setup Data Types便可选定D时设置的数据类型;
2)A:可以将图形字符由十六进制数转化成图形,如果一个字节不行,可多选一些字节;
3)C:将数据转换成代码;
4)G:跳转至相应的地址处;
5)Ctrl+F:寻找相应名称的内容;
6)Shift+F9:打开结构体类型窗口;
在结构体类型窗口中,
7)Insert(Fn+PgDn得到):创建新的结构体类型;
8)Delete:删除某一个结构体类型;
在结构体end处,按‘D’便可插入成员变量;
9)Alt+Q将某个变量转成一个结构体类型,如果代码区有符号变红,说明该地址处原先的也是一个结构体,但后来被其它的定义给覆盖,按两下‘K’即可打散数据;
10)K:打散数据;
11)T:将某一符号转成结构体成员变量;
12)对于一个函数起始处,D、C、右键——CreateFunction即可还原。

2.ida中查找数组类型及个数的方法

13)通过Edit——Operand——Number——选择转换的类型。
14)Y键可以让变量的类型重新更改;
15)写一个*.h文件,然后通过File——LoadFile——Parse C Header File (Ctrl+ F9),然后选择插入结构体,用快捷键INS,会出现一个
窗口界面,左下角出现Add standard Structcture,点击便可从导入的结构体中选取。很多时候如果ida不能识别某些结构体,可以写写
头文件,然后导入到ida中。
在汇编中,只要是符合内容属性一致、地址具有连续性,就可以断定这一串数据是数组了,当然可能作者并没有定义数组,但是只要符合以上两个属性,就是了,作者没定义成数组,是作者菜。数据的类型首先是判断字节数,然后根据指令,判断是浮点型数据,还是整型数据,当然通过普通整型赋值指令也可以判别。lea edi, [esp+esi4+1D0h+var_1A4]指令便说明var_1A4为某一数组的首地址,每个元素字节为4,因为比例因子为4,lea edx, [esp+eax8+1D0h+var_168]指令中var_168是元素字节为8的数组的首地址。
对于数组元素,一般都会有赋值,所以可通过赋值,在内存查找相似数据且相连的一个数据,其中的个数便是数组元素个数。当然对于占很大字节的数组初始化为0内容时,一般会用串拷贝指令,且是rep stosd,如指令mov ecx, 58h xor eax, eax lea edi, [esp+1D0h+var_160] mov [esp+1D0h+var_168], 0 mov [esp+1D0h+var_164], 0 xor ebp, ebp rep stosd

4.ida中动态调试时查看模块中的API列表,如下:

Ctrl + S会列出所有模块,但点击只是进入模块首地址,看不了其中导出函数,通过Debugger——Debugger Windows中打来模块列表显示的模块列表,点击会出现API名称。
View——OpenSubview中可打开很多窗口,如导入表和导出表。

四.总结

以上内容是最近的心得,用于日后查看,如果有新知识和不准确的内容,也会添加或修改。浏览的网友,如果发现了问题,望批评指针!

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值