Можно ли использовать getauxval с LD_PRELOAD?

У меня есть файл C внутри, в котором есть две очень маленькие подпрограммы, которые переопределяют getauxval,

unsigned long int __wrap_getauxval (unsigned long int __type) {
  printf("foobar");
  exit(5);
}

unsigned long int getauxval (unsigned long int __type) {
  printf("foobar");
  exit(5);
}

Я компилирую это с

gcc -shared -fPIC -ldl -Wl,-wrap=getauxval hax.c -o hax.so

Вот так я могу запустить это

LD_PRELOAD=/tmp/hax.so myExec

И он напечатает foobar и умрет, но если я удалю getauxval и буду полагаться только на LD-обернутую версию __wrap_getauxval, я вижу, что это не работает. Что мне здесь не хватает? Почему я могу повторно реализовать getauxval и LD_PRELOAD, но не могу их обернуть? И что мне делать, чтобы обернуть такую ​​функцию, как getauxval?


person Evan Carroll    schedule 04.01.2018    source источник


Ответы (1)


В итоге я сохранил указатель на функцию

static unsigned long int (*real_getauxval)(unsigned long int __type) = NULL;

И затем использовать dlsym для динамического извлечения символа

real_getauxval = dlsym(RTLD_NEXT, "getauxval");

Затем я смог легко обернуть getauxval

person Evan Carroll    schedule 05.01.2018