利用FLRIT恢复符号表---笔记

2023-12-26 00:28
文章标签 恢复 笔记 符号表 flrit

本文主要是介绍利用FLRIT恢复符号表---笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • FLIRT
    • 应用FLIRT签名
    • 创建FLIRT签名文件
      • 创建签名概述
      • 识别和获取静态库
      • 创建模式文件
      • 创建签名信息

FLIRT

在某些ELF文件中,IDA无法识别库函数的签名。就会导致IDA加载的函数全是sub_xxxx的形式,这给我们的逆向工程造成极大的困难。

在这里插入图片描述
这个时候就可以利用IDA自带的FLIRT来帮助我们逆向。(也有finger,luman等工具可以实现这个需求)

库快速识别和鉴定技术,简称FLIRT,是IDA用于识别库代码的一组技术。

FLIRT的核心是各种模式匹配算法,这些算法使IDA能够迅速确定,一个经过反汇编的函数是否与IDA已知的许多签名中的某一个相匹配。

应用FLIRT签名

IDA/sig中包含一些常见的库。

在IDA中,File->Load File->FLIRT signature file可以打开可用的library窗口,这个窗口中的内容实际上就是IDA文件路径下sig中的pc文件夹内容。可以选择其中一个点击OK,导入相关库信息,IDA会自动识别可以识别的函数。
在这里插入图片描述

第二种方法就是Shift+F5打开Singatures窗口,然后右键点击Apply new signature,接着如上。
在这里插入图片描述

网络上有经过整合的sig文件:https://github.com/push0ebp/sig-database 各个架构各个版本的都有。

可以下载后选择合适的添加到IDA/sig/pc下,再到IDA中导入。

缺点:大多数情况下都不清楚目标文件所对应的库函数版本,可能需要多次尝试才能成功。

有个脚本,iscan.py可以匹配文件所对应的库文件(https://github.com/maroueneboubakri/lscan)本人实测,代码跑不了一直报错,所以这里不多做评价。(有没有路过的佬有解决办法的o(╥﹏╥)o)

创建FLIRT签名文件

IDA不可能自带所有的静态库的签名文件,使用现有的sig签名也很大可能得不到正确的结果。

因此,就要自己手动创建FLIRT签名文件。

IDA中的FLAIR工具集一般在IDA路径中包含,解压下来即可。FLAIR中包含几个文本文件,其中特别有用的如下:

  • readme.txt 总体概述签名创建过程。
  • plb.txt 描述静态解析器plb的用法。
  • pat.txt 详细说明了模式文件的格式,它是签名创建过程的第一步。
  • sigmake.txt 这个文件描述了sigmake.exe的用法。

创建签名概述

四个步骤:

  • 获得一个要创建签名文件的静态库
  • 利用FLAIT为库创建一个模式文件
  • 使用sigmake处理生成的模式文件,生成一个签名文件
  • 将签名文件复制到sig中。

识别和获取静态库

生成文件的第一步是确定你所需要的静态库。

有俩种办法;

  • 第一种

    根据你的文件找到它所依赖的库,你可以找到这个库的源代码,使用源代码创建你自己的静态库,然后使用这个库生成签名文件。

  • 第二种

    确定你所分析的二进制文件的真实来源,即具体的操作系统、操作系统版本和发行版本(如果适用)。根据这些信息,从一个配置完全相同的系统中复制相关的库。

使用第一种方法可能会导致你生成的静态库和目标库有所差异,所以导致签名文件不同,因此最好的方法是第二种。

接着问题:如何找到所需的静态库?

使用file命令或者strings命令。

file 命令可以显示文件的基本构建信息,这些信息提供了有关可能使用哪个操作系统和编译器来创建文件的线索。

例如:

image-20231225171335482

file命令显示 dacls_sample 是一个 64 位 ELF(可执行和链接格式),针对 GNU/Linux 3.2.0 进行静态链接和剥离。版本号 3.2.0 对应于用于编译示例的 ABI(应用程序二进制接口)版本。

strings可以搜索二进制文件中的字符串,记得加上 -a 迫使strings扫描整个二进制文件。

也可以使用readelf命令,如

└─$ readelf -p .comment easyre           
String dump of section '.comment':[     0]  GCC: (Debian 11.2.0-13) 11.2.0

这里就显示了easyre文件是在Debian操作系统上使用GCC编译的,(Debian 11.2.0-13)这是Debian的版本信息,后面的11.2.0是GCC的版本信息。

因此若要制作easyre的签名,最好的办法就是创建一个Debian 11的操作系统,获取其中的静态库。

创建模式文件

在FLAIR中的bin目录下可以找到以下解析器:

  • plb.exe/plb OMF库的解析器(Borland编译器常用)
  • pcf.exe/pcf COFF库的解析器(windows编译器常用)
  • pelf.exe/pelf ELF库的解析器(类Unix编译器常用)
  • ppsx.exe/ppsx Sony PlayStation PSX库的解析器
  • ptmobj.exe/ptmobj TriMedia库的解析器
  • pomf166.exe/pomf166 Kiel MOF 166对象文件的解析器

要为一个库创建一个模式文件,需要与指定的库的格式对应的解析器、你希望解析的库的名称以及生成的模式文件的名称。

例如,上面Debian是一种类Unix系统,要使用pelf,经过上一步也可以得到一个.a后缀的静态库文件。

┌──(kali㉿kali)-[/home/sigtest]
└─$ ./pelf libc.a examplelibc.pat       
/home/sigtest/libc.a: skipped 14, total 2057

这里解析器会指出被解析的文件、被忽略的函数的数量(14)以及生成的签名模式的数量(2057)。

创建签名信息

使用sigmake工具。

┌──(kali㉿kali)-[/home/sigtest]
└─$ ./sigmake examplelibc.pat examplelibc.sig

如果一切正常,就可以得到一个sig文件,将其复制到目录下,就OK了。但是一般情况下,在生成签名文件的过程中,会发生函数之间的冲突。

解析器一般会指出:

┌──(kali㉿kali)-[/home/sigtest]
└─$ ./sigmake examplelibc.pat examplelibc.sig
examplelibc.sig: modules/leaves: 1685/2034, COLLISIONS: 27
See the documentation to learn how to resolve collisions.

同时会产生一个exc排斥文件。

文件的开头通常是:

;--------- (delete these lines to allow sigmake to read this file)
; add '+' at the start of a line to select a module
; add '-' if you are not sure about the selection
; do nothing if you want to exclude all modules__pthread_equal                                   	00 0000 31C04839F70F94C0C3..............................................
thrd_equal                                        	00 0000 31C04839F70F94C0C3.............................................._IO_putc                                          	2D D13A 41545589FD534889F34883EC10F64674800F84B9000000F70600800000746148
fputc                                             	2D D13A 41545589FD534889F34883EC10F64674800F84B9000000F70600800000746148__fseeko                                          	04 749A 415541544189D4554889F5534889FB4883EC18F707008000007547488BBF8800
fseek                                             	04 749A 415541544189D4554889F5534889FB4883EC18F707008000007547488BBF8800
......

解除冲突的方法就是先删除前4行的内容,之后可以在函数前面添加加号或者减号;如果希望数据库在匹配某一个签名的时候,使用该名字,那就在前面添加一个“+”号,如果你想在数据库匹配到一个签名时简单的添加一条注释,那你就在名字签名添加一个“-”号,如果你希望不应用任何名字,那就不要添加任何符号。

例如:

+___ntohs 00 0000 0FB744240486C4C3................................................
___htons  00 0000 0FB744240486C4C3................................................_index   00 0000 538B4424088A4C240C908A1838D974074084DB75F531C05BC3..............
_strchr   00 0000 538B4424088A4C240C908A1838D974074084DB75F531C05BC3.............._rindex  00 0000 538B5424088A4C240C31C0908A1A38D9750289D04284DB75F35BC3.......
-_strrchr 00 0000 538B5424088A4C240C31C0908A1A38D9750289D04284DB75F35BC3..........

这表示,第一个签名匹配时我们选择使用ntohs名字,第二个签名匹配时什么也不做,第三个签名匹配时添加strrchr为注释。

解决完冲突后再次运行sigmake命令。

sigmake命令还可以添加一条指令 -n用于指定生成的库名称。

例如:

$ ./sigmake -n"FreeBSD 6.1 C standard library" libc_FreeBSD61.pat libc_FreeBSD61.sig

后言:
今天的一点点小结,其实还是一知半解的。写了笔记就顺便润色一下发出来,本来今天是想复现强网杯的easyre的,结果开局一个符号还原就差不多花了一天。。。还没有还原出来,做出来的第一个签名随便找到libc.a还原出了103个函数,其他的都只可以还原几个。好难啊,现在打算下个新的虚拟机搭个Debian11出来,希望明天可以复现出来。。。也不知道Debian可不可行。
有个WP大佬说finger符号还原,可是我的finger一点用都没有,实在搞不懂啊。学习真难o(╥﹏╥)o,碎碎念。今天还是圣诞节Merryykuisimen!

这篇关于利用FLRIT恢复符号表---笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/537494

相关文章

使用Python实现网络设备配置备份与恢复

《使用Python实现网络设备配置备份与恢复》网络设备配置备份与恢复在网络安全管理中起着至关重要的作用,本文为大家介绍了如何通过Python实现网络设备配置备份与恢复,需要的可以参考下... 目录一、网络设备配置备份与恢复的概念与重要性二、网络设备配置备份与恢复的分类三、python网络设备配置备份与恢复实

MySQL使用binlog2sql工具实现在线恢复数据功能

《MySQL使用binlog2sql工具实现在线恢复数据功能》binlog2sql是大众点评开源的一款用于解析MySQLbinlog的工具,根据不同选项,可以得到原始SQL、回滚SQL等,下面我们就来... 目录背景目标步骤准备工作恢复数据结果验证结论背景生产数据库执行 SQL 脚本,一般会经过正规的审批

通过ibd文件恢复MySql数据的操作方法

《通过ibd文件恢复MySql数据的操作方法》文章介绍通过.ibd文件恢复MySQL数据的过程,包括知道表结构和不知道表结构两种情况,对于知道表结构的情况,可以直接将.ibd文件复制到新的数据库目录并... 目录第一种情况:知道表结构第二种情况:不知道表结构总结今天干了一件大事,安装1Panel导致原来服务

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C