前言

笔者去年给 pwntools 写了一点小功能,让他能在本地离线的场景下根据泄露出来的地址搜索 libc 版本,不用安装其他的库了。现在终于在正式版本 4.15.0 中发布了,这里简单分享一下使用方法。

命令行

fetch:下载 libc-database

1
pwn libcdb fetch

第一次使用会询问你是否要在 /var/lib/libc-database 目录初始化,输入 yes 之后自动下载

之后运行相同的命令会更新 /var/lib/libc-database 的仓库代码

使用 pwn libcdb fetch -u xxx 可以下载/更新指定分类的 libc,一般来说 ubuntu 和 debian 就够了

file:查看 libc 的信息

1
pwn libcdb file xxx

lookup:搜索偏移

1
pwn libcdb lookup

添加 --offline-only 实现离线搜索

hash:搜索指定 hash 的 libc

1
pwn libcdb hash

这个功能会默认尝试 unstrip 恢复 libc 的符号,想完全离线需要同时添加 --offline-only --no-unstrip 参数

脚本编写

导入方式

和正常的导入方法一样 import 即可

1
from pwn import *

相关接口

search_by_symbol_offsets

1
2
3
4
from pwn import *

res = libcdb.search_by_symbol_offsets({"puts": 0xe50, "printf": 0x6f0, "dup2": 0x010})
print(res)


也可以离线搜索并直接选择 index

1
2
3
4
5
6
7
8
9
from pwn import *

path = libcdb.search_by_symbol_offsets(
{"puts": 0xe50, "printf": 0x6f0, "dup2": 0x010},
select_index=1,
offline_only=True,
)
libc = ELF(path)
print(libc)

search_by_hash 系列

有这几个函数,调用方法都是一样的

1
2
3
4
search_by_libs_id
search_by_md5
search_by_sha1
search_by_sha256

这里以 search_by_md5 举例

1
2
3
4
from pwn import *

res = libcdb.search_by_md5("4a2402572cbe5f090b6c2a4c24c5e5e8")
print(res)

添加如下参数可以完全离线

1
2
3
4
5
6
7
8
9
from pwn import *

path = libcdb.search_by_md5(
"4a2402572cbe5f090b6c2a4c24c5e5e8",
offline_only=True,
unstrip=False,
)
libc = ELF(path)
print(libc)

参考资料

更多详细用法参考官方文档