execve(2)を乗っとる
http://ukai.jp/debuan/2000w/auto-apt.txtの辺を見て、実際に手を動かしてexecve(2)を乗っとってみた。試した環境は、NetBSD-1.6.2。環境によってlibcのパスが違うと思うので、適宜修正が必要。
ソースファイル hoge.c
#include <stdio.h> #include <stdlib.h> #include <err.h> #include <dlfcn.h> #define LIBC_PATH "/usr/lib/libc.so" static int (*execve_org)() = NULL; int execve(const char *path, char *const argv[], char *const envp[]) { if (execve_org == NULL) { void *handle = dlopen(LIBC_PATH, RTLD_LAZY); if (handle == NULL) err(EXIT_FAILURE, "dlopen"); execve_org = dlsym(handle, "execve"); if (execve_org == NULL) err(EXIT_FAILURE, "dlsym"); } fprintf(stderr, "<%s>\n", path); return execve_org(path, argv, envp); }
コンパイル方法
$ gcc -shared hoge.c
ここでは、/usr/pkg/bin/bashのexecveを乗っとってみる。
$ LD_PRELOAD=./a.out /usr/pkg/bin/bash bash-3.00$ ls </bin/ls> a.out hoge.c bash-3.00$ date </bin/date> Mon Mar 21 09:22:24 JST 2005
さて、これが何に使えるかっていうとあまりいいアイディアはないんけどね…‥