Перейти к содержимому

astral17

Пользователи
  • Публикации

    76
  • Зарегистрирован

  • Посещение

  • Победитель дней

    7

astral17 стал победителем дня 2 августа 2019

astral17 имел наиболее популярный контент!

Репутация

65 Обычный

3 подписчика

astral17

  • Звание
    Участник

Информация

  • Пол
    Мужчина

Посетители профиля

1 403 просмотра профиля
  1. Только они чутка бракованные. В первом варианте поскольку рандом с границами генерирует включительно, иногда генерирует на 1 цифру больше, т. е. [1; 10], [10; 100] и т. д. А во втором варианте оно вообще фигню делает, [10; 18], [100; 198] и т. д. Ну и чутка бессмысленный момент: 0 это число длины 1, а должна ли функция его генерировать?
  2. Tree() - собирает дерево, у нас цикл в цикле, получается соберёт 10 * 5 = 50 деревьев. Судя по условиям ты считаешь, что x это номер рассматриваемого дерева, тогда что такое "a"? (есть догадки, что это количество рядов, но учитывая, что нету кода перехода между ними, то это вряд ли правда), если убрать этот цикл, то получится код, который пробегается ровно 5 различных деревьев из изначального ряда, причём 6 раз обобрав последнее, не катит. Кстати, интересный факт, x не может быть одновременно и меньше и равным числу 5, а в коде ты это явно просишь if x < 5 then ToTree() if x == 5 then robot.turnAround() robot.forward() end end Вообще зачем проверять тебе, меньше ли x, чем 5 не понятно, поэтому эта строчка явно лишняя, т.к. она мешает передвигаться к следующему дереву, убрав её получим код, который полностью пробежится по целому ряду в одну сторону и обратно. Но нужно помнить, что робот будет развёрнут в обратную сторону относительно момента до запуска функции. Однако, судя по схеме между деревьями 1 блок, тогда зачем в развороте forward ? Вообще всякие магические числа в коде для читабельности желательно избегать или хотя бы описывать, что они означают (если не совсем очевидные конечно). Ну и код без отступов больно читать.
  3. Трудно что-то тут сказать, т. к. слишком мало информации. По возможности хотелось бы увидеть скрины как всё было поставлено, что внутри пк и скрин самой ошибки, список модов, которые были дополнительно установлены. Если при спавне компа командой он не был ни с чем соединён (т. е. полностью изолирован от других компонентов), и был произведён чисто запуск без смены комплектации, то возможно появился какой-то баг OpenComputers, хотя это маловероятно. Вообще единственное предположение пока возникает, что была произведена попытка запуститься с пустой дискеты (после крафта дискеты нужно потом объединить с книжкой OC, чтобы получить OpenOS).
  4. @ArtHacker ну, там короче при загрузке защищается список таблиц, куда входит и os , однако либа filesystem не полностью загружается при загрузке из-за package.delay, например файлик boot/02_os.lua содержит в самом конце строчку require("package").delay(os, "/lib/core/full_filesystem.lua") а файл boot/90_filesystem.lua эту require("package").delay(fs, "/lib/core/full_filesystem.lua") ну, а теперь как именно работает эта функция, после её использования устанавливается временная метатаблица, которая после первого обращения к любому индексу этой таблицы самоудаляется и запускает файл, который указан вторым аргументом. Проблема возникает из-за того, что таблица os защищается (т.е. скрипт, который запустит full_filesystem стирается до своего запуска), а filesystem нет. Фиксить эту проблему можно перед защитой искусственно обратиться к какому-то рандомному индексу проблемных таблиц, хотя, очевидно, что такой метод это дикий костыль, хоть и простой в реализации.
  5. ммм, у нас походу немного разное понятие boot было, я подумал, что кинуть файл в /boot/*.lua , но вижу был не прав. Однако согласен, что я не заметил, что package.loaded присваивается от локальной и от неё работает, в этом моя ошибка. Однако это остаётся актуальным. Замена _G.package может сработать против тех, кто не доверяет require и идёт напрямик. При изменении /lib/core/boot.lua всё нормально запустилось. UPD: И если что, я не говорю, что именно ты должен сделать эту защиту, я говорю, что ты должен помочь тем, кто захочет это сделать, ведь использовать набор методов из библиотеки гораздо проще, чем написать её с нуля
  6. На счёт сломается система, запускал на OpenOS 1.7.2 в boot tprotect не становился глобальной переменной, поэтому RE был, ок, заменил первую строчку на tprotect = require ... , система зависла и отказалась загружаться. Ок попробуем не из boot запустить, а как обычный файл..., ммм эпик фэйл, команды консоли сломались, можно было идти глубже но зачем, ведь предложенные строчки для другой системы (а вообще, хоть у package есть оригинал на себя, у него не хранится отдельно оригинал на package.loaded , который становится readonly , но это опустим). Предположим, что это сработало, никто до сих пор не мешает подменить функцию require и при вызове require("tprotect") заменить на своё. Или заменить _G.package на другую таблицу. Именно из-за таких проблем я и написал И это также отвечает на это: Можно и дальше перечислять проблемы, но раз меня критикуют, я пожалуй откажусь. Однако основная мысль прошлого сообщения была в добавке возможности защиты частичной таблиц, т.е. чтобы только некоторые поля были readonly , что позволило бы юзеру с гораздо меньшими усилиями защититься от всего перечисленного выше. Однако хозяин - барин, автор библиотеки не я, поэтому и не я выбираю, что в ней будет, а только предлагаю.
  7. Если сделать package.loaded readonly то вся система сломается к чертям, т.к. не сможет загружать новые библиотеки и т.д. и т.п., ещё проблемка в том, что нужно в таком случае защищать и _G ведь кто мешает подменить package на другую таблицу?, затем кто мешает подменить функцию require ?, заменить require на костыль, который вместо tprotect вернёт заражённую копию?, так что тут как вариант добавить readonly поля по выбору, затем функция не возвращает метатаблицу зеркала, а возвращает метатаблицу оригинала. Когда говорил, что иногда хотелось бы видеть метатаблицы, я имел ввиду через getmetatable . Ну а вообще, для другой системы может и будет внутренняя защита от таких вещей, но это нужно смотреть на то, какая структура будет.
  8. Ну, из уязвимостей вроде бы и всё, конечно же проблема до сих пор возникает "как получить эту библиотеку, если зловред уже работает", т.е. он может спокойно подменить require , package и т.д. , т.е. даже если библиотека загружена, ты не можешь удостовериться в том, что это правда она, однако то, что сама таблица защищена уже гарантирует, что те, кто получил её не обнаружат сюрприз. Как фиксить такое фз, и это уже просто чисто для размышлений (но было бы неплохо, если можно было подтвердить). Было бы неплохо, если сам код был под спойлером в теге "код". Как знаешь, в таблицах, которые хочешь защитить могут находиться также и другие таблицы. Иногда хочется защитить и их (но не всегда), поэтому хотелось бы видеть функцию, которая будет рекурсивно защищать все таблицы от изменений, которые есть в защищаемой таблице. (не забудь про возможность зацикливания, например в защищаемой таблице может вдруг оказаться ссылка на её саму). Ну и на последок, то, что в getmetatable от зеркала возвращается строка защитная, не очень хорошо, иногда хотелось бы видеть метатаблицу, оригинальной (конечно же readonly), тут тогда возникает вопрос, до какой глубины идти?, ответ: до тех пор, пока есть метатаблица у метатаблицы и она ещё не защищена (в кратце расширение к рекурсивной защите). В принципе это будет создавать дополнительные нагрузки на память, поэтому можно поставить флажок, нужно ли так делать. Вроде бы большего ожидать от этой библиотеки смысла скорее всего нету (до тех пор, пока она касается только защиты таблиц). А за старания респект. UPD: короче, нужен багфикс сего чуда Если вкратце, то при обращении к метаметодам зеркала получается, что оно берёт сырые значения из метатаблицы (вот как раз таки причина, почему у меня не удалась та атака с __add , ну да ладно, она хотя бы показала, что в теории любая глобальная переменная может быть злом), а это может оказаться довольно довольно важной вещью таблицы (т.е. нужно сделать будет редирект всех метаметодов, либо изменить структуру работы).
  9. Дубль 2, короче сдаюсь в этот раз получилось гораздо качественнее, уязвимости есть, но не очень критические и легко фиксятся. Так сказать защита rawset не очень хороша), а если точнее, то error не обязательно выходит из функции, например если сделать так, как на скрине, то сразу понятно, что код продолжит работу. Т.е. нужно либо хранить персональный error , либо дописать везде return nil или что-то похожее), похожая проблема с getmetatable и setmetatable , т.е. если их переписать, то получится, что мы сможем выхукнуть таблицы в момент их защиты. Также это дело касается type , т.к. я могу обломать валидацию mto на таблицу и запихнуть через __metatable функцию, т.е. tcopy_mt = mto = myfunction , а если __index это функция, то при обращении к метатаблице я смогу получить и саму чистую метатаблицу, т.е. mt, а сама она никак не защищена, как сиё сделать, (цель вообще вытянуть protectid) , смотрим, нам нужно обратиться в mt к значению, которого нету например _add , а значит вызывается __index в который помещается mt, "__add" и тут мы и хукаем mt. (как вытянуть не проверялось, и писалось почти с закрытыми глазами, так что скорее всего сиё чудо только в теории, завтра чекну)
  10. Интересная защита), сломать функцию rawset , чтобы она не работала) т.е. она получает метатаблицу и запускает функцию в ней, во-первых если метатаблицы нету, краш), если метатаблица есть, то всё равно краш, т.к. в ней нету этой функции) Затем tprotect.open не работает, причина проста, mto может равняться nil , т.е. если создать чистую таблицу, и её защитить, получим epic fail... возвращаемая таблица через getmetatable(ptbl) , где было вызвано tprotect.protect(ptbl) является mt2 и её можно редактировать, такая же проблема вообще и на саму ptbl распространяется, т.к. __newindex работает только в случае, если такого ключа нету, если ключ есть, то нужно использовать __index , однако получив таблицу mt2 даже с доступом на чтение мы сможем спокойно выудить все значения, и protectid и списочек nonpi (я так и не понял, зачем он вообще нужен, как вариант посолить, чтобы сложнее было вытянуть protectid, но в таком случае слишком мало соли). Вообще protectid можно получить просто через tprotect.isProtected , т.к. там получается метатаблица у таблицы, которую мы передаём внутрь и обращается по индексу protectid , т.е. секретным назвать его трудно. Но вернёмся к нашим баранам, mt2 допустим у неё есть __index тоже, значит we need to go deeper , смотрим на метатаблицу mt2, она не защищена, т.е. её можно спокойно изменять и мы видим спокойно все её значения снимаем защиту на изменение mt2 -> profit возвращаемся сюда, порядок в lua слева на право, т.е. в начале оно споткнётся об nil , а потом проверит, а защищалась ли таблица вообще?, т.е. нужно поменять местами для начала if ((not tprotect.isProtected(t)) and not cantrawset) or getmetatable(t).isOpened(protectid) then если не защищено, то оно не будет пытать метаметод isOpened , однако mt2 мы можем спокойно редактировать, т.е. isProtected и cantrawset мы можем управлять их значениями. Ещё можно атакуемую таблицу заменить на свою таблицу, дождаться пока её не попробуют открыть, и таким образом заполучить ключ (MitM attack) Либо пойти более общим путём, раз getmetatable не сохраняется, то просто подменить его и вытянуть интересующие таблички в момент защиты, открытия и т.д. и т.п., либо в setmetatable сделать так, чтобы устанавливались во время защиты свои, т.е. их тоже нужно копировать и защищать) Затем функция open немного бесполезна, т.к. получается, что таблица на момент выполнения кода не защищена, лучше сделать вариацию, где возвращается таблица, изменяя которую изменяется оригинальная, причём защищённая таблица остаётся защищённой. Также сам tprotect тоже нужно защищать, т.к. перезаписать функции библиотеки хватит, чтобы сломать её защиту (функции хранятся в открытом виде в package, где можно спокойно подменить, и require будет возвращать её) , также require тоже нужно защищать. Т.е. по факту защита работает успешно только для защищённых ранее и не открывая доступ во время выполнения чего-то, что может иметь плохие желания. Ладно, пока что на этом хватит, резюмируя всё выше сказанное, её ещё пилить и пилить. А вообще возникает чувство, что автор её даже не проверял, т.к. работают только 2 функции protect и unprotect , а функция rawset вообще под чистую сломана. Ну надеюсь в следующей версии автор учтёт хотя бы часть написанного тута, и следующая версия библиотеки будет лучше.
  11. Вопрос такой, будет ли интересно, если сделать продолжение этого квеста?), прост я себе написал списочек из 10 различных идей взлома банка (+ ещё есть пару мыслей, что можно добавить) и можно тогда будет сделать часть 2, где нужно будет взламывать целый ряд банков, с различными уровнями сложности, от просто послушать трафик, до приличной серии махинаций. В принципе реализовать всё это можно за пару дней (при наличии желания), однако стоит ли?
  12. То чувство, когда автор карты сделал 2 уязвимости, а хакнул через 3ю 🤣, потом после хака я уже понял идею, как можно было хакнуть ещё причём проще, а когда смотрел уже код, я понял, что автор имел ввиду немного не те дыры (интересно то, что все 3 дыры находятся в разных частях кода), скорее всего первую он имел ввиду ту, которую можно сразу сделать без танцев с бубном, а вторую это уже чисто удача или читать исходники. В принципе со стороны кубика, предназначенного для того, чтобы его ломали и разбирали то довольно не плохо, однако выводить в релиз как работоспособую и безопасную систему явно нельзя 😅
  13. Скорее всего значит у тебя установлена OpenOS 1.6.1 , а значит просто тебе нужно будет подменять event.shouldInterrupt local event = require("event") function DisableInterrupt() if _G.shouldInterruptBackup then return false end _G.shouldInterruptBackup = event.shouldInterrupt event.shouldInterrupt = function() return false; end return true end function EnableInterrupt() if type(_G.shouldInterruptBackup) ~= "function" then return false end event.shouldInterrupt = _G.shouldInterruptBackup return true end вставляешь это в начало кода, а потом, когда нужно вызываешь функцию, которая тебе нужна (думаю это и так понятно), если и это не сработает. то тогда скажи, чему равна переменная _G._OSVERSION
  14. Ну, перед тем, как задавать вопрос желательно поискать, задавался ли он до этого и есть ли на него ответ. http://computercraft.ru/topic/2396-kak-otklyuchit-ctrlaltc/?do=findComment&amp;comment=35069 Если это не сработает, то нужно будет сказать, какая версия мода и OpenOS, ведь там меняли эту вещь. В начале была функция shouldInterrupt , потом её убрали и пришлось костылить, а в самой новой версии вернули возможность через обработку process.info().data.signal хмм, прочитав код и видя строчки for i = 1, 255 do print() end становится больно, эмм, зачем?? и что они должны делать?, очищать экран?, temp.clear() на что? Затем ещё табуляция есть не везде, например после while true do оно так и остаётся монотонным текстом, ну ладно, это я уже отошёл от темы.
  15. Ну, если есть предложения, что добавить/изменить/исправить, то я с радостью приму это.
×
×
  • Создать...