Я работаю над школьным исследованием уязвимости Грязной Коровы. Во время моего исследования я нашел некоторые решения (например, этот), которые вводят некоторый шеллкод в 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?
Задача ещё не решена.
Других решений пока нет …