• XSS.stack #1 – первый литературный журнал от юзеров форума

Подмена CurrentDirectory без SetCurrentDirectory

CheckerChin

(L2) cache
Забанен
Регистрация
05.11.2018
Сообщения
485
Решения
3
Реакции
255
Гарант сделки
1
Пожалуйста, обратите внимание, что пользователь заблокирован
Всем привет. Есть вопрос по поводу пути CurrentDirectory.
Я так понимаю он лежит в peb->ProcessParameters->CurrentDirectoryPath.
Как его правильно подменить? Я хочу избежать вызова SetCurrentDirectoryW.
Есть такой набросок


C:
PPEB ppeb = get_peb();
int len = sizeof(WCHAR) * lstrlenW(path);
WCHAR slash[2] = { L'\\' , 0};
BOOL append_slash = *(path + lstrlenW(path) - 1) != L'\\'; // путь передали без слэша в конце
if (ppeb->ProcessParameters->CurrentDirectoryPath.MaximumLength > len + 1) {
    lstrcpyW(ppeb->ProcessParameters->CurrentDirectoryPath.Buffer, path);
    ppeb->ProcessParameters->CurrentDirectoryPath.Length = len;
    if (append_slash) {
        ppeb->ProcessParameters->CurrentDirectoryPath.Length += 1 * sizeof(WCHAR);
        lstrcatW(ppeb->ProcessParameters->CurrentDirectoryPath.Buffer, slash);
    }
}


структура CurrentDirectoryPath меняется вроде бы корректно. По крайней мере ProcessHacker отображает корректную директорию для процесса.
Но относительные пути не работают. Скажем, хочу прочитать файл в этой директории и его не может найти. Отсюда следует то, что это не единственное место, где должен меняться этот путь.
Может кто-то разбирался с анализом RtlSetCurrentDirectory_U и знает чего не хватает?
 
Из ошибок:
1) Ты не меняешь хендл директории в структуре CURDIR
2) Ты не используешь синхронизацию при модификации пеба RtlAcquirePebLock() -> EnterCriticalSection(), это к проблеме не относится, но может доставить неудобств в будущем

Код правильной реализации можно увидеть тут https://doxygen.reactos.org/d0/d23/sdk_2lib_2rtl_2path_8c.html#ab5b58270e1c8d35eabbd447e473b4dbf
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх