минимальный пример < /h1>
Код: Выделить всё
crash_preload.c:#define _GNU_SOURCE
#include
#include
#include
#include
typedef void* (*dlsym_t)(void*, const char*);
static dlsym_t real_dlsym = NULL;
static int in_dlsym = 0;
static bool moduleLoaded = false;
__attribute__((constructor))
static void onModuleLoad() {
moduleLoaded = true;
}
static int numCalls = 0;
static void setup_real_dlsym() {
// Try loading the specific symbol version from GLIBC
real_dlsym = (dlsym_t)dlvsym(RTLD_NEXT, "dlsym", "GLIBC_2.2.5");
if (!real_dlsym) {
real_dlsym = (dlsym_t)dlvsym(RTLD_NEXT, "dlsym", "GLIBC_2.17");
}
if (!real_dlsym) {
fprintf(stderr, "Failed to resolve dlsym from GLIBC_2.2.5 or GLIBC_2.17\n");
exit(1);
}
// Call dlsym through the resolved symbol to get the unversioned one
real_dlsym = (dlsym_t)real_dlsym(RTLD_NEXT, "dlsym");
if (!real_dlsym) {
fprintf(stderr, "Failed to resolve final dlsym via resolved dlsym\n");
exit(1);
}
}
void* dlsym(void* handle, const char* symbol) {
numCalls++;
if (!real_dlsym) {
setup_real_dlsym();
}
if (in_dlsym || !real_dlsym) {
return NULL; // prevent recursion
}
if (moduleLoaded) {
printf("Intercepted dlsym: %s, numCalls: %d\n", symbol, numCalls);
}
in_dlsym = 1;
void* result = real_dlsym(handle, symbol);
in_dlsym = 0;
return result;
}
< /code>
построить и запустить < /h2>
gcc -fsanitize=address -fPIC -shared -o crash_preload.so crash_preload.c -ldl
LD_PRELOAD=/lib/x86_64-linux-gnu/libasan.so.6:`readlink -f crash_preload.so` python
< /code>
проблема < /h1>
Поведение не согласован: < /p>
Иногда питон начинается нормально, а перехват DLSYM работает < /li>
Другие времена. Проблема в том, что Либасан вызывает DLSYM до того, как какие -либо статические переменные в моей библиотеке станут инициализированы. Я думаю, что это может привести к какой -то странной коррупции, в которой куча даже не инициализируется, поэтому любые призывы к Malloc внутренне в DLSYM были бы не определенными.
Я не уверен, где даже начать отлаживать это, авария, кажется, произойдет во время ранней инициализации, и я не могу легко добавить вывод отладки на этом этапе.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... -deadlysig
Мобильная версия