利用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

相关文章

使用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

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi