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

news2025/2/14 3:00:14

文章目录

  • 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!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1335127.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫中的多线程、线程池

进程和线程的基本介绍 进程是一个资源单位,线程是一个执行单位,CPU调度线程来执行程序代码。 当运行一个程序时,会给这个程序分配一个内存空间,存放变量等各种信息资源,而这个内存空间可以说是一个进程, 一…

Linux文件系统与命令行

什么是命令行? 接收键盘命令并将其传给操作系统执行的程序(用于输入和管理命令的程序),统称命令行,也叫: Shell,几乎所有Linux发行版都提供了一个 Shell 程序,叫做: Bash (Bourne-Again Shell, 因为最初的 Shell 是由 Steve Bourne 编写的原始 Unix 程序, Again 表…

ChatGPT新增聊天存档功能,可构建自己的聊天数据库啦!

12月21日,OpenAI在社交平台宣布,ChatGPT新增存档功能,用户可以保存聊天记录而不必删除它们。 虽然这只是一个很小的功能,但对于科研、医疗、写作、金融、律师等,对文本使用频率较高的行业帮助巨大,可构建自…

Vue3设计目标和优化

vue3.0的设计目标是什么?做了哪些优化? Vue3的设计目标:更小、更快、更友好、优化方案 一、设计目标 Vue3之前我们会面临的许多问题: 随着功能的增长,复杂组件的代码变得越来越难以维护起来缺少一种比较【干净】的…

YACS(上海计算机学会竞赛平台)一星级题集——评委打分

题目描述 许多比赛在计算选手得分平均数的时候,都会先去掉一个最高得分,再去掉一个最低得分,这样可以避免极大值与极小值对平均值的影响。 给定 n 个数字 a[1]​,a[2]​,⋯,a[n]​,表示一个选手获得的分数,请根据上述…

【力扣】199.二叉树的右视图

看到这个题目的一瞬间,我想递归,必须用递归。最近被递归折磨的有点狠,但是我感觉我快要打败它了,就是现在稍稍有点处于劣势。不过没关系,来日方长不是。 法一:递归 题解: 之前想的就是先递归&…

【Vue3+TypeScript】快速上手_笔记

前言 1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n 经历了:4800次提交、40个RFC、600次PR、300贡献者 官方发版地址:Release v3.0.0 One Piece vuejs/core 截止2023年10月&#xf…

读文献、写论文时,有什么好用的软件或网站推荐?

高考志愿、考研保研、职业规划、简历优化,欢迎加入《猴哥成长营》! https://www.yuque.com/jackpop/ulig5a/srnochggbsa2eltw?singleDoc 读文献、写论文对于绝大多数本科生、研究生、博士生都是必经之路。 当突然面对这样一项任务时,会觉得…

NVIDIA NCCL 源码学习(十二)- double binary tree

上节我们以ring allreduce为例看到了集合通信的过程,但是随着训练任务中使用的gpu个数的扩展,ring allreduce的延迟会线性增长,为了解决这个问题,NCCL引入了tree算法,即double binary tree。 double binary tree 朴素…

单位圆内接三角形的角是外接三角

证明 ∠ A P C 2 ∠ A B C ∠APC2∠ABC ∠APC2∠ABC ∴ ∴ ∴ 三角形内角和为180 $∵ \begin{cases} ∠ABP∠BAP∠APB180 \∠ABC∠BAC∠ACB180 \∠PAC∠PCA∠APC180 \end{cases} $ ∴ A P B P P C r ∴APBPPCr ∴APBPPCr ∵ ∵ ∵△PAB和△PAC为等腰三角形 ∴ ∴ ∴等腰三…

redis—String字符串

目录 前言 1.字符串数据类型 2.常见命令 3.典型应用场景 前言 字符串类型是Redis最基础的数据类型,关于字符串需要特别注意: 1)首先Redis中所有的键的类型都是字符串类型,而且其他几种数据结构也都是在字符串类似基础.上构建的,例如列表…

ROS xacro优化URDF

Xacro是ROS中的一个工具,用于简化URDF文件的编写。它的主要目的是构造更短、更易读的XML文件,同时保持与URDF的兼容性。 以下是Xacro的基本语法和用法: 1、属性设置和算数运算: 可以使用xacro:property来定义常量或变量&#xf…

《Git快速入门》Git分支

1.master、origin、origin/master 区别 首先搞懂git分支的一些名称区别: master : Git 的默认分支名字。它并不是一个特殊分支、跟其它分支完全没有区别。 之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创建它&#xff0c…

利用markdown语法,写出数学公式以及常用符号【持续更新!!!】

1.希腊字母 数学表达式Markdown语法α\alphaβ\betaγ\gammaδ\deltaε\epsilonζ\zetaη\etaθ\thetaι\iotaκ\kappaλ\lambdaμ\muν\nuξ\xiο\omicronπ\piρ\rhoσ\sigmaτ\tauυ\upsilonφ\phiχ\chiψ\psiω\omega 2.基本表达式 数学表达式Markdow语法xx^2y₁y_1∞\…

医学影像处理与智能医学:数据集资源和云端加速路径

医学影像处理识别是一种利用计算机技术影像进行识别、分析和处理的方法。它主要应用于医学影像学领域,如 X 射线、CT 扫描、MRI 和超声等。通过图像处理技术,可以对这些影像进行数字化处理,提取有用信息,辅助医生进行疾病诊断、治…

如何编写高效清晰的嵌入式C程序

作为嵌入式工程师,怎么写出效率高、思路清晰的C语言程序呢? 要用C语言的思维方式来进行程序的构架构建 要有良好的C语言算法基础,以此来实现程序的逻辑构架 灵活运用C语言的指针操作 虽然看起来以上的说法很抽象,给人如坠雾里的感觉&…

【Element】el-select下拉框实现选中图标并回显图标

一、背景 需求&#xff1a;在下拉框中选择图标&#xff0c;并同时显示图标和文字&#xff0c;以便用户可以直观地选择所需的图标。 二、功能实现 <template><div><el-table ref"table" :data"featureCustom2List" height"200"…

AXI总线协议---关键信号波形图分析

写过程协议图 读过程协议图 读协议执行顺序图 写协议顺序图 单箭头表示两个信号谁先有效无所谓&#xff0c;双箭头表示必须要等到前一个信号有效才能将后面的信号有效 如何体现协议图中的通道理解 声明&#xff1a;以上图均采用AMBA总线文档图 写过程关键信号 主机 写地址—M…

鸿蒙基础-常用组件与布局(ArkTS)

实现“登录”页面 本节主要介绍“登录”页面的实现&#xff0c;页面使用Column容器组件布局&#xff0c;由Image、Text、TextInput、Button、LoadingProgress等基础组件构成。 // LoginPage.ets Entry Component struct LoginPage {...build() {Column() {Image($r(app.media…

isp代理/双isp代理/数据中心代理的区别?如何选择?

本文我们来详细科普一下几种不同的代理类型&#xff1a;isp代理/双isp代理/数据中心代理&#xff0c;了解他们的区别&#xff0c;选择更适合自己的代理类型。 在讲述这几种代理类型之前&#xff0c;我们先复习一下代理大类有哪几种。 一、机房代理和非机房代理 在做代理ip选…