From c027416fd5536f1ed1eaf67b8ebd39211509cfc0 Mon Sep 17 00:00:00 2001 From: yorick Barbanneau Date: Fri, 16 Nov 2018 10:52:10 +0100 Subject: [PATCH] Add shared libraries TDM --- .gitignore | 1 + content/progsys/TDM_9-les_librairies/index.md | 63 +++++++++++++++++++ .../TDM_9-les_librairies/src/libuname.c | 14 +++++ 3 files changed, 78 insertions(+) create mode 100644 content/progsys/TDM_9-les_librairies/index.md create mode 100644 content/progsys/TDM_9-les_librairies/src/libuname.c diff --git a/.gitignore b/.gitignore index 29247d5..83c3913 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ public/ *.bin +*.so diff --git a/content/progsys/TDM_9-les_librairies/index.md b/content/progsys/TDM_9-les_librairies/index.md new file mode 100644 index 0000000..b4430c6 --- /dev/null +++ b/content/progsys/TDM_9-les_librairies/index.md @@ -0,0 +1,63 @@ +--- +title: "TDM : les librairies" +date: 2018-11-16 +categories: ["Programmation système", "TD machine"] +--- + +Le but de ce TD est de détourner la commande `uname` en réécrivant la fonction +`uname()` dans une librairie partagée et de charger celle-ci grâce à un +`LD_PRELOAD` + +Pour afficher de information sur la la fonction `uname`, il suffit de faire un +`man 2 uname` + +## code de ma fonction de remplacement + +```c +#include +#include + +int uname(struct utsname *buf) +{ + + strcpy(buf->sysname,"Windows GNU/LINUX"); + strcpy(buf->nodename, ""); + strcpy(buf->release, "10.0.0.1"); + strcpy(buf->version, "10.2"); + strcpy(buf->machine, "Shittycorp processors inc."); + + return 1; +} +``` + +Il faut charger les entêtes `sys/utsname.h` (définition de la structure de +donnée `utsname`) et `string.h` (pour l'utilisation de `strcpy()` + +Cette dernière est nécessaire pour manipuler les chaines de caractères avec le +pointer `*buf` vers la structure de données `utsname`. + +## compilation et exécution + +la compilation de la librairie se fait donc avec `gcc` et les arguments `-fPIC` +et `-shared`: + +```shell +gcc -Wall -fPIC -shared ./src/libuname.c -o src/libuname.so +``` + +Comme indiqué en cours, il suffit d'exécuter le programme `uname` en +préchargeant notre librairie : + +```shell +LD_PRELOAD=./libuname.so uname +``` + +*Attention*, il fait bien indiqué le répertoire dans lequel se trouve la +librairie dans le `LD_PRELOAD`, même si elle se situe dans le répertoire +courant. Ici j'ai bien spécifié `./libuname.so`, en ne mettant que `libuname.so` +dans le `./` le chargement de la librairie ne fonctionne pas : + +```shell +LD_PRELOAD=libuname.so uname +ERROR: ld.so: object 'libuname.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored. Linux +``` diff --git a/content/progsys/TDM_9-les_librairies/src/libuname.c b/content/progsys/TDM_9-les_librairies/src/libuname.c new file mode 100644 index 0000000..e09fa88 --- /dev/null +++ b/content/progsys/TDM_9-les_librairies/src/libuname.c @@ -0,0 +1,14 @@ +#include +#include + +int uname(struct utsname *buf) +{ + + strcpy(buf->sysname,"Windows GNU/LINUX"); + strcpy(buf->nodename, ""); + strcpy(buf->release, "10.0.0.1"); + strcpy(buf->version, "10.2"); + strcpy(buf->machine, "Shittycorp processors inc."); + + return 1; +}