All streams
Search
Write a publication
Pull to refresh
272
0.2
Send message

ЕМНИП я использовал алгоритм Чудновского на ПК, но вообще замечание корректно - алгоритмы разные и даже отдаленного сравнения не провести между машинами.

PS: Будет еще один заход, но уже с более быстрым алгоритмом от Белларда. Там уже можно даже с современными процессорами посравнивать.

Я только потом добавил PS, что статья моя.

Используя rust - маловероятно.

Довольно популярная задачка на отреверсить VM без знания формата инструкций. Тем не менее, всегда мне нравились такие таски)

То ли я навострился на таких задачах в школе/универе, то ли они действительно несложные, но каждая решается за минуту. Дополнительные вопросы поинтереснее, но тоже не rocket science.

В elasticsearch на пару дней. Обычно этого достаточно чтобы понять проблему.

Если в двух словах, то храним в redis'e не только кэш, но и флаг того что у нас есть inflight запрос.

  const cached = await dbService.get(cacheKey(id));
  if (cached) {
    return cached;
  }

  // need to pre-subscribe, if we would subscribe after flag checking we can miss event
  const fetchedEvent = eventForFetchedData(id);
  const inflightPromise = new Promise((resolve) => {
    messageBusService.sub(fetchedEvent, ({ data }) => {
      messageBusService.unsub(fetchedEvent).catch();
      resolve(data);
    });
  });

  const fetchStartEvent = eventForFetchStart(vin);
  const fetchStartPromise = new Promise((resolve) => {
    messageBusService.sub(fetchStartEvent, ({ tag }) => {
      messageBusService.unsub(fetchStartEvent).catch();
      resolve(tag);
    });
  });

  const inflightRequest = await dbService.get(cacheKeyForInflightFlag(id));
  if (inflightRequest !== null) {
    return inflightPricePromise;
  }

  const requesterId = getRequesterId();
  await messageBusService.pub(fetchStartEvent, { tag: requesterId });
  const firstRequesterId = await fetchStartPromise;
  // we lost that race, some other thread was first to send message to message bus,
  // that it is going to fetch data!
  if (firstRequesterId !== requesterId) {
    return inflightPromise;
  }

  messageBusService.unsub(fetchedEvent).catch();
  const data = await callToAPI(id);
  await dbService.set(cacheKey(id), data);
  await dbService.del(cacheKeyForInflightFlag(id));
  // order is important, we need to clean flag first, otherwise consumer can subscribe
  // inbetween pub and del operations and get stuck
  await messageBusService.pub(fetchedEvent, { data });
  return data;

Забавно: мы похожую задачку даём на техническом интервью) Не всё же алгоритмами мучать - нужно что-то и из реального мира проверять.

Кроме redlock'a можно и pubsub использовать, который предоставляется редисом из коробки. Правда там тоже нужно код аккуратно написать, дабы не нарваться на другие race condition'ы уже.

`access token` приложения лимитирован. В частности столкнулся с тем, что через этот токен нельзя работать с github packages. Самое забавное, что дефолтный GITHUB_TOKEN позволяет это, а вот через токен приложения - ни-ни.

Вместо getContent лучше использовать другой метод для получения SHA текущей версии файла.

/*
 * Return content for specific file from repo
 *
 * It has limit by 1MB
 * Encoded in base64 by default
 */
const getFileContent = authorizeFn(
  (
    repo,
    path,
    branch,
  ) => (
    githubClient.repos.getContent({
      owner: ORGANIZATION_NAME,
      repo,
      path,
      ...branch && { ref: `refs/heads/${branch}` },
    })
  ),
);

/*
 * Return info (sha/size/...) for file
 */
const getFileInfo = async (repo, path, branch) => {
  const folder = path.split('/').slice(0, -1).join('/');
  const folderContent = await getFileContent(repo, folder, branch);
  const fileEntry = folderContent.find(({ path: filePath }) => filePath === path);
  if (!fileEntry) {
    throw Error(`File ${path} not found!`);
  }
  return fileEntry;
};

/*
 * Get SHA of existing file
 */
const getSHAForExistingFile = async (repo, path, branch) => {
  try {
    const { sha } = await getFileInfo(repo, path, branch);
    return sha;
  } catch (err) {
    return undefined;
  }
};

Заливка файлов не так важна у вас, но можно в один коммит включать несколько файлов, хоть это и более муторно - нужно создать git blob'ы для каждого файла, затем git tree, создать сам коммит и обновить branch head на sha новосоздонного коммита.

То что эксплоит позволяет исполнять произвольный код внутри процесса chrome это не является уязвимостью? Ну-ну.


Далеко не новость, что сейчас зловреды используют несколько уязвимостей чтобы скомпроментировать систему. Даже после того, как код выберется из песочницы, еще необходимо эксплутаировать ошибку в самой ОСи для повышения привелегий.

Единственное, надо сразу писать огромными буквами в самом начале, что изменение параметров блоков или прошивка обновлений может превратить автомобиль в кирпич и придется менять блоки на новые, а это недешевое удовольствие.

в большинстве случаев можно выпаять флеш-память и использовать программатор.

у порше же с более-менее свежих годов всё через онлайн, не?

насколько я помню, любой может заливать write-up на площадку. мб, ralf и залил этот write-up на HTB?

Эта опция deprecated уже фиг знает сколько времени. Может и была такая уязвимость лет 5 назад, но сейчас это не совсем актуально.

Когда я удалил gmail (через Titan Backup), он всё равно остался где-то прописан, и периодически (раз в 3-5 минут) система напоминала об его отсутствии alert'ом.

Information

Rating
2,916-th
Location
Красноярск, Красноярский край, Россия
Registered
Activity