Giriş
Açıklaması şöyle. Eğer uygulama binary dosyasında setcap yapılmışsa LD_PRELOAD çalışmayabilir
... OP's binary has privilege features added to it: capabilities. This switchs ld.so(8) into secure-execution mode which by default disables most dynamic-linker related environment variables, including LD_PRELOAD and LD_DEBUG.
Örnek
Şöyle yaparız. Burada kendim libsystem.so kütüphanesini yazıyorum. Amaç system() çağrısını kesip gelen parametrenin değerini değiştirmek
Şöyle yaparız. Burada kendim libsystem.so kütüphanesini yazıyorum. Amaç system() çağrısını kesip gelen parametrenin değerini değiştirmek
#define _GNU_SOURCE
#include <dlfcn.h>
#include <string>
#include <iostream>
typedef int (*orig_system_type)(const char *command);
extern "C" int system(const char *command)
{
std::string new_cmd = std::string("set -f;") + command;
// next line is for debuggin only
std::cout << new_cmd << std::endl;
orig_system_type orig_system;
orig_system = (orig_system_type)dlsym(RTLD_NEXT,"system");
return orig_system(new_cmd.c_str());
}
Derlemek için şöyle yaparız.g++ -shared -fPIC -ldl -o libsystem.so system.cppÇalıştırmak için şöyle yaparız.
$ LD_PRELOAD=/path/to/libsystem.so ./myprogramÖrnek
Şöyle yaparız. Burada setlocal çağrısını kesiyoruz
# cc -shared -fPIC -xc - <<< 'char *setlocale(int c, const char *l){ errx(1, "not today"); }' -o /usr/lib64/liblo.so # chmod 4755 /usr/lib64/liblo.soŞöyle yaparız
$ LD_PRELOAD=liblo.so su -
su: not today