Как найти адреса символов в vDSO по заданному адресу vDSO?
Я работаю над школьным исследованием уязвимости Грязной Коровы. Во время моего исследования я нашел несколько решений (например, это), которые вводят некоторый шелл-код в vDSO (в функцию __vdso_clock_gettime
).
Это решение и все его производные используют жестко закодированную константу в качестве смещения для символа __vdso_clock_gettime
в рамках vDSO. Однако эта константа не действительна для всех версий ядра и vDSO (по крайней мере, для устройств Android).
Есть ли лучший способ найти адрес (смещение) символа внутри vDSO в C/C++? Я старался
handle = dlopen("[vdso]", RTLD_LAZY);
с [vdso]
будучи результатом
dladdr((void*)vdso_addr, &dlinfo);
LOG("dladdr: %s", dlinfo.dli_fname);
с vdso_addr
нашел в /proc/self/auxv
, но я получаю dlopen failed: library "[vdso]" not found
,
Я знаю, что vDSO - это системный вопрос, и обычная программа не должна решать, вызывать ли из него функции или нет, но есть ли какой-то универсальный способ найти адрес символа в C / C++, не разбирая каждую возможную версию vDSO и не делая база данных адресов?
Как система получает адреса символов во время виртуального системного вызова vDSO?