
Construire une base de données des offsets libc pour simplifier l'exploitation
libc-database dispose désormais d'un service web et d'une interface frontale. Visitez https://libc.rip/ pour l'essayer ! Lisez https://github.com/niklasb/libc-database/tree/master/searchengine si l'API vous intéresse.
Si vous rencontrez des erreurs, veuillez vérifier la section « Prérequis » ci-dessous.
Récupérez les catégories de libc souhaitées et extrayez les décalages des symboles. Cela ne téléchargera rien deux fois, vous pouvez donc également l'utiliser pour mettre à jour votre base de données :
$ ./get # Liste des catégories
$ ./get ubuntu debian # Télécharge les libc d'Ubuntu et Debian, ancien comportement par défaut
$ ./get all # Télécharge toutes les catégories. Peut prendre du temps !
Vous pouvez également ajouter une libc personnalisée à votre base de données.
$ ./add /usr/lib/libc-2.21.so
Recherche toutes les libc dans la base de données qui ont les noms donnés aux adresses données. Seuls les 12 derniers bits sont vérifiés car la randomisation fonctionne généralement au niveau de la taille des pages.
$ ./find printf 260 puts f30
archive-glibc (libc6_2.19-10ubuntu2_i386)
Recherche une libc à partir de l'adresse de retour divulguée dans __libc_start_main.
$ ./find __libc_start_main_ret a83
ubuntu-trusty-i386-libc6 (libc6_2.19-0ubuntu6.6_i386)
archive-eglibc (libc6_2.19-0ubuntu6_i386)
ubuntu-utopic-i386-libc6 (libc6_2.19-10ubuntu2.3_i386)
archive-glibc (libc6_2.19-10ubuntu2_i386)
archive-glibc (libc6_2.19-15ubuntu2_i386)
Affiche quelques décalages utiles, étant donné un ID de libc. Vous pouvez également fournir vos propres noms à afficher.
$ ./dump libc6_2.19-0ubuntu6.6_i386
offset___libc_start_main_ret = 0x19a83
offset_system = 0x00040190
offset_dup2 = 0x000db590
offset_recv = 0x000ed2d0
offset_str_bin_sh = 0x160a24
Vérifie si une bibliothèque est déjà dans la base de données.
$ ./identify /usr/lib/libc.so.6
local-f706181f06104ef6c7008c066290ea47aa4a82c5
Ou trouve une libc en utilisant un hachage (actuellement BuildID, MD5, SHA1 et SHA256 sont implémentés) :
$ ./identify bid=ebeabf5f7039f53748e996fc976b4da2d486a626
libc6_2.17-93ubuntu4_i386
$ ./identify md5=af7c40da33c685d67cdb166bd6ab7ac0
libc6_2.17-93ubuntu4_i386
$ ./identify sha1=9054f5cb7969056b6816b1e2572f2506370940c4
libc6_2.17-93ubuntu4_i386
$ ./identify sha256=8dc102c06c50512d1e5142ce93a6faf4ec8b6f5d9e33d2e1b45311aef683d9b2
libc6_2.17-93ubuntu4_i386
Télécharge l'intégralité des bibliothèques correspondant à un ID de libc.
$ ./download libc6_2.23-0ubuntu10_amd64
Getting libc6_2.23-0ubuntu10_amd64
-> Location: http://security.ubuntu.com/ubuntu/pool/main/g/glibc/libc6_2.23-0ubuntu10_amd64.deb
-> Downloading package
-> Extracting package
-> Package saved to libs/libc6_2.23-0ubuntu10_amd64
$ ls libs/libc6_2.23-0ubuntu10_amd64
ld-2.23.so ... libc.so.6 ... libpthread.so.0 ...
Pour exécuter ces scripts, vous aurez besoin des commandes suivantes dans votre PATH :
En plus des prérequis pour les systèmes basés sur RPM, vous aurez besoin de :
En plus des prérequis pour les systèmes basés sur Debian, vous aurez besoin de :
Pour tout installer sur Debian 10, exécutez ces commandes :
apt-get update
apt-get install -y \
binutils file \
wget \
rpm2cpio cpio \
zstd jq