15 Haziran 2017 Perşembe

LD_PRELOAD

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
#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




Hiç yorum yok:

Yorum Gönder