背景

搭建IDA调试远程Linux的环境过程中,我在Linux上使用file工具查看ELF文件得到了一下信息:
这里写图片描述

这个可执行文件是使用的是静态编译,同时在最终生成可执行文件时,删除了符号表和重定位信息。所以在IDA中看到的汇编代码如下:

这里写图片描述

函数调用都显示的是IDA生成的“哑”名(eg,sub_414410),这对分析函数功能时造成了很大障碍,因为花了很大精力分析了某一个函数调用的功能后,发现这是一个静态库函数,这将浪费很多的时间。

可以通过一些技巧快速的分析函数功能:

  1. 如果分析函数体内容并不多,并且没有大量的调用其他函数调用(eg,strlen函数),可以结合IDA提供的函数流程图很容易分析出函数的功能。
  2. 如果函数体代码很多或者内部调用的很多其他函数,可以通过观察和函数执行相关的数据(eg,参数或其它关系的数据)变化,来猜测函数的功能。如果执行前后关键的数据都没有变化那通常说明这个函数并不是分析的重点(当然这也不是绝对的,至少要在这个函数位置打上可疑记号)。

但仍有假设之外的情况,又或者你是一个逆向偏执狂,那我们有没有其他办法呢?这里再次感谢IDA提供的高级功能“FLIRT签名”。

FLIRT技术

库快速识别和鉴定技术,简称FLIRT。是IDA用于识别库代码的一组技术。为了让IDA为我们识别程序需要我们为分析的程序应用签名,可以通过SHIFT-F5快捷方式打开应用签名窗口:

这里写图片描述

这里显示程序并没有应用任何签名,通过右键菜单【Apply new signature…】添加IDA默认提供的签名:

这里写图片描述

但显然IDA并没有提供Linux下的编译器GCC关联的库,因为Linux版本很多且自带的libc.a也不相同,所以就需要自己来创建签名。

创建FLIRT签名文件

创建签名可归结为以下4个步骤:

  1. 获得你希望为其创建签名文件的静态库。
  2. 利用其中一个FLAIR解析器为该库创建一个模式文件。
  3. 运行sigmake.exe来处理生成的模式文件,并生成一个签名文件。
  4. 将新的签名文件复制到/sig目录中,安装这个文件。

确定静态库版本

其实在搭建IDA的远程调试环境时,已经提到为了创建sig文件,已经选好了Linux版本CentOS-6.5-x86_64。在Linux中找到/usr/lib64/libc.a,这个就是要创建签名的C标准库。

创建模式文件

接下来,开始创建模式文件。把合适版本的FLIRT解析器拷贝到Linux上,这里我把/bin/linux下的所有文件都拷贝到Linux上,其实只需要pelf和sigmake这两个文件即可。

可以通过下面的命令来创建模式文件:
这里写图片描述

其中,libc.a文件已经被我从/usr/lib64/libc.a拷贝到和pelf相同目录下。解析器指出被解析的libc.a文件中有5个函数被忽略、有1441个函数生成了函数模式。GCC_4.4.7_libc.pat就是最终生成的模式文件。

创建签名文件

我们使用sigmake使用工具从模式文件创建签名文件,通过下面的命令来执行:
这里写图片描述

可以看到并没成功的创建签名文件,结果信息提示在生成签名文件过程中发现了签名模式的“冲突”。所谓“冲突”就是库函数中有相同模式的两个或多个函数(eg,index和strchr,因为那俩函数基本上代码完全一致),如果不解决“冲突”就生成签名的话,在应用改签名分析时IDA是不知道该使用哪个函数。在我们创建签名过程中一共发现了15个冲突文件。

发生“冲突”后sigmake会生成一个排斥文件以指导如何解决“冲突”,在文件夹中发现的GCC_4.4.7_libc.exc就是排斥文件。用vim打开看一下:

这里写图片描述

这里显示了两部分信息,第一部分是告诉该如何解决冲突,也就是“;”开头的代码:

这里写图片描述

翻译一下这段代码告诉我们的解决冲突的要点:

  1. 为最大限度的减少冲突,请删除排斥文件开头的4个注释行。
  2. 最多只能给冲突函数组中一个函数附加+/-。
  3. 如果一个冲突函数组仅包含一个函数,不要再该函数前面附加+/-,让他保持原样。
  4. Sigmake连续运行失败后会将数据(包括注释行)附加到现有的排斥文件后。在再次运行sigmake之前必须确保已经删除了额外的数据,并更正了原始数据(如何这些数据时正确的)。

这里需要解释“+/-”,“+”号代表你很确信要选择函数冲突组中的函数,这是IDA会使用这个函数显示而忽略其他函数,“-”代表你并不是很缺陷你的选择,这时IDA会在数据库中添加一段关于这个函数的注释。如果你什么都不加的话,IDA就会忽略这个签名,不做任何处理。

第二部分信息就是要解决的函数冲突组:
这里写图片描述

对函数冲突组的选择,可能需要我们对这些函数的理解基础上才能做抉择。当解决完所有冲突后,需要运行和之前一样的命令:
这里写图片描述

很幸运一次就解决了“冲突”,通常可能需要我们解决多次,这个过程是不断反复的过程,不过只要我们按照解决冲突的要点去做,这不是问题。

安装和应用签名文件

最后,安装创建好的签名文件并应用到逆向分析中。把签名文件拷贝到/sig目录中,然后再【Apply new signature…】窗口中会看到:

这里写图片描述

说明安装成功,选择这个签名后,来看看反汇编窗口中的变化:

这里写图片描述

我们看到IDA为我们匹配4个库函数,没有匹配的函数调用显然是一个指针函数。


Logo

更多推荐