自己搭建一个libc database

为什么要自己搭建一个 libc database 呢,因为官方的https://libc.rip/api/查询接口挂了官方的查询接口时好时坏,现在又可以用了。

注意

如果官方的接口可用,我就会暂时下线自己部署的接口 https://libc.roderickchan.cn

如果你发现官方的接口用不了了,请及时联系(email)我,我会重启服务。

为什么要自己搭建一个libc database呢,因为写文章的时候官方的https://libc.rip/api/查询接口挂了。而我写的pwncli中的LibcBox依赖这个接口,挂了之后直接影响了LibcBox的使用。既然不能白嫖了,那不如自己动手搭建一个。自己动手,丰衣足食。

下载项目

niklasb/libc-database: Build a database of libc offsets to simplify exploitation (github.com)下载源码,下载后,先安装一下必备的软件包:

1
2
3
4
5
6
7
8
sudo apt-get update && \
sudo apt-get install -y \
  binutils file \
  wget \
  rpm2cpio cpio \
  zstd jq nodejs npm
  
pip3 install elasticsearch==7.0.0 # 最好装这个版本的,否则会遇到很多奇怪的问题

安装结束后,先执行./get all然后等待一两分钟后直接Ctrl+C。不要等待这个操作执行完,该命令非常耗时,执行完大概要等一个小时左右。因此,可以先下载一部分用于测试。

文件修改

域名

直接使用vscode的全局替换,把所有的https://libc.rip替换为https://yourdomain.com

index

然后对index.py修改如下:

1
2
- es = Elasticsearch()
+ es = Elasticsearch(config.ES_HOST)

nginx.conf

由于我本身就使用了nginx服务器,所以我把配置添加到/etc/nginx/nginx.conf

记得申请证书并把证书放置在服务器上。

除此之外,可以修改docker-compose.yaml中的端口映射,避免端口冲突。

前端生成

libc-database/searchengine/frontend中执行:

1
2
npm install
npm run build

构建镜像

使用在libc-database/searchengine,使用docker compose up -d构建镜像。

可以使用阿里云的镜像,替换/etc/sources.list/etc/pip.conf

生成索引

libc-database/searchengine执行python3 -m index ../db

接口测试

测试查询接口:

1
2
3
curl -X POST -H 'Content-Type: application/json' --data \
     '{"symbols": {"strncpy": "db0", "strcat": "0x000000000d800"}}' \
     'https://yourdoamin.com/api/find'

无异常说明部署成功了。

访问https://yourdoamin.com访问前端页面。

全部更新

测试接口没问题之后,在libc-database/searchengine,执行./update.sh。建议把update.sh修改为:

1
2
3
4
5
6
#!/bin/bash
cd "$(dirname "$0")"
cd ..
./get all
cd searchengine
python3 -m index ../db

等待update.sh执行完成,就完事儿了。

访问我的

点击:https://libc.roderickchan.cn可以在线查询

image-20230215163236241

还可以使用下面的命令查询。

1
2
3
curl -X POST -H 'Content-Type: application/json' --data \
     '{"symbols": {"system": "290", "puts": "0x000420"}}' \
     'https://libc.roderickchan.cn/api/find'

image-20230215163211200

接口已同步更新到pwncli中,pwncli的使用方式为:

1
2
3
4
5
from pwncli import *

lb = LibcBox()
lb.add_symbol('system', 0x290)
lb.search()
Buy me a coffee~
roderick 支付宝支付宝
roderick 微信微信
0%