diff options
author | Xiretza | 2019-06-11 21:56:08 +0200 |
---|---|---|
committer | Xiretza | 2019-06-19 00:22:35 +0200 |
commit | c8ba3b03b4d4b5e1bb219fe340b59607778b9f20 (patch) | |
tree | c4c470de5cd62c8611e9b481b9510242f2ec21af /spoof_homedir.c | |
download | aur-c8ba3b03b4d4b5e1bb219fe340b59607778b9f20.tar.gz |
Initial commit
Diffstat (limited to 'spoof_homedir.c')
-rw-r--r-- | spoof_homedir.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/spoof_homedir.c b/spoof_homedir.c new file mode 100644 index 000000000000..caee9b033b2e --- /dev/null +++ b/spoof_homedir.c @@ -0,0 +1,28 @@ +#define _GNU_SOURCE +#include <dlfcn.h> +#include <pwd.h> +#include <sys/types.h> + +/* shared library that replaces the home directory for root in a `getpwuid()` call + * with a specific location + * + * inspired by https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/ + * + * Usage: + * gcc -shared -fPIC -D 'FAKE_HOME="/path/to/fake/directory"' spoof_homedir.c -o spoof_homedir.so -ldl + * LD_PRELOAD="./spoof_homedir.so" binary_to_spoof + */ + +typedef struct passwd *(*orig_getpwuid_f_type)(uid_t uid); + +struct passwd *getpwuid(uid_t uid) { + orig_getpwuid_f_type orig_getpwuid; + orig_getpwuid = (orig_getpwuid_f_type)dlsym(RTLD_NEXT, "getpwuid"); + + struct passwd *result = orig_getpwuid(uid); + if (uid == 0) { + result->pw_dir = FAKE_HOME; + } + + return result; +} |