# 关于恢复符号表这件事 2

前言

由于 rizzo 恢复符号表真滴一言难尽,于是重拾之前如何恢复符号表这个任务

在这个阶段,鄙人确实找到了一个办法去进行符号表恢复

使用 FLAIR,由于网上的资料晦涩难懂,于是鄙人打算亲自写一篇去自己去理解

# FLAIR

flair 通过对库文件中的函数生成签名,并生成对应的签名文件,然后和程序中的函数进行签名匹配找到匹配的函数来帮助我们还原库函数。

image-20240627180330677

这是此项目需要用到的 linux 文件,因为鄙人习惯使用 linux 系统,所以会用 linux 系统下的 elf 文件用法去讲解

先给出一篇网上的文章

image-20240627180549231

这篇文章使用的是 libc.a,鄙人在使用这个文件时,会生成 pat 文件,但是并不是 pat 文件。也就是说它生成 pat 的文件是错误的 pat 文件,而且它也是使用的 libc.a 文件,说明你需要网上去找(不好寻找,另一种方法是下载此类系统,我想是个聪明人都会觉得这是小题大作了吧。

由此鄙人寻找另外一种办法去配合 sigmake 文件去生成 sig 文件

https://github.com/mandiant/flare-ida/tree/master

项目连接在上面

image-20240627181108547

使用的 ida 脚本如上,只需要将 libc.so.6 文件拖入 IDA 只用,然后使用 IDA 脚本,就会生成 pat 程序。

image-20240627181227878

接下来在使用 sigmake 生成符号表即可

如果生成 err 文件,我们需要在 exc 删除前面几句话再次执行一次 sigmake 即可

# 效果演示

gcc -s -static a.c -o test
#include <stdio.h>
int main() {
    printf("Hello, World!\n");
    return 0;
}

# 未加符号表之前

image-20240627181833052

# 过程

# 生成 pat 文件

首先拿到相关程序版本的 libc.so.6 文件,放入 ida 中

image-20240627182157239

image-20240627182240476

# 生成 sig 文件

image-20240627182335363

./sigmake libc-2.27.pat libc-2.27.sig

image-20240627182446012

image-20240627182511242

删掉所选内容

再次生成 sigmake 文件

image-20240627182556888

此时就生成了 sig。

# 恢复符号表

将其放进 sig 下的 pc 下

image-20240627182712207

在要恢复符号的程序下按下 shift + F5

image-20240627182830901

导入符号表

双击即可

image-20240627182920891

image-20240627182950032

加符号表之后

image-20240627183127161

可见恢复的还是比较多

https://github.com/push0ebp/sig-database