Вот как раз пару месяцев назад попался какой то dell latitude, «бизнес класса», дорогущий. Железо средненькое, дисплей просто ужасный (никогда не воротил носом от дисплеев, но тут глаза просто вытекают, особенно на слабоконтрастных текстах; подкручивание контраста/гаммы слегка улучшает читаемость но от изображения ничего не остаётся; возможно я слишком привык к тынкпадовскому IPS). Обрадовался что тоже есть трекпоинт — оказалось что кнопки тачпада расположены под дико неудобным углом, одновременно держать трекпоинт и нажимать их нереал. Зато качество сборки просто идеальное… (в моем thinkpad x230 люфтят usb и порт для зарядки, неприятно но не страшно). Наверное ещё батарею круто держит, но мне это не нужно.
За ASUSPRO спасибо, заценю. Раньше пользовался только асусами, хотя и были проблемы (быстро дохнут б/п, один раз вымерла матрица, клавиатуры тоже дохнут).
Макбуки не моё. Да и за адекватное железо ценник у них нехилый.
Пример атаки:
1. Атакер снифает одну сессию. Из неё узнает кусок гаммы (pyra-poster + версия + хедер бинаря + паттерны в бинаре и т.д. и т.д.). Затем выбирает, например, 5й блок шифротекста в качестве «злого» IV.
2. Потом MITMом атакер вклинивается и подсовывает клиенту свой IV (он же rand1). Из структуры AES-CFB следует, что гамма просто «сдвинулась» назад на 5*16 байт. Поэтому атакер может расшифровать ранее неизвестные ему куски бинаря, используя известные ему части гаммы. Более того, он узнаёт новые части гаммы из того же запроса по предыдущей методике и расшифровывает куски из первого запроса.
Затем атакер может перехватывать каждую последующую сессию и подсовывать клиенту тот же IV и вытаскивать данные новых бинарей.
3. Атакеру всё мало, он запрашивает у сервера новый rand1. Отдаёт клиенту свой старый IV для которого он умудрился вычислить большую часть гаммы. Клиент шифрует свой бинарь. Бинарь вышел небольшим, и атакер восстанавливает его весь, а значит он знает его sha1 хэш. Клиент получает «ошибка, рандом протух. перезапустите скрипт». Клиент перезапускает скрипт а атакер подсовывает ему новый, реальный rand1 от сервера. Клиент шифрует тот же бинарь. Но атакер знает теперь всё что после rand0, поэтому узнаёт всю нужную гамму. И допивая рутбир зафигачивает реверс-шелл на сервачок.
PS: В идеале нужно использовать библиотечное Authenticated Encryption. Иначе, самое простое и надежное что можно придумать — encrypt-then-mac (что и является по сути AE, главное именно в таком порядке). Шифруем только бинарь, затем навешиваем (H)MAC. На сервере первым делом проверяем MAC. Для ограничения реплеев можно использовать тот самый «rand1» но ни в коем случае не в качестве IV/параметра шифра, а просто закинуть под HMAC (можно даже не шифровать). Можно обойтись без первого GETa, используя в качестве rand1 таймстамп. Хотя девелоперы могут расстроиться из-за расстроеного времени на сервере.
RSA тут не нужно, т.к. ключ клиент заливает на сервер по защищенному каналу (будем надеяться..). Хотя в качестве подписи это надежнее в том плане, что если кто то читанет исходники на сервере — узнает только публичный ключ.
В CFB не нужен padding, поэтому «padding oracle» конечно же не в тему. SHA1 по моему тут используется тупо как хэш («хеш исполняемого файла»). Автор пусть почитает про MAC/HMAC.
Так в конце получается команда «cat<<<'Happy new year'», которую я и запускаю. Почему не «echo» или «printf»? Они просто длиннее — каждая лишняя буква это морока с переменными и операциями.
echo 'Happy new year' короче же на 1 символ? Да и можно без кавычек:
Вообще аргумент можно взять в кавычки и тогда вся строка будет в sys.argv[1]. Если оочень лень вводить кавычки и хочется, чтобы несколько аргументов сливались самим скриптом — делаем " ".join(sys.argv[1:]). Но основная проблема — экранировать нужно не только пробел. Банальные примеры: ; ! () < >. Так что часть аргументов все равно придется брать в кавычки. Это по поводу bash -> python.
Модуль commands Deprecated since version 2.6:. getoutput если и использовать, то только в скриптах для себя. В идееале нужно вызывать subprocess.check_output() с командой в виде списка (если передавать строкой то будет тот же getoutput):
Да, это неудобно, зато аргументы будут переданы корректно и не нужно ничего экранировать. +Нету лишнего вызова bash'а, zenity будет вызван напрямую. +Наверняка есть библиотеки для таких вызовов по типу prepared statements в SQL.
PS: ещё заменчание по регэкспам: [0-9][0-9][0-9][0-9] никто не пишет, надо \d{4}. (Только к строке-регэкспу добавить префикс r, чтобы слеш не утек).
Мелькнула мысль, что если ГПСЧ выдает полностью состояние (допустим 32 бита), либо инъективную функцию от состояния, то его можно с большой вероятностью «отличить от рандома» простым общим статистическим тестом — у «правильного» рандома из примерно 2**17 выходов хотя бы два должны совпасть. У описанного ГПСЧ совпасть выходы так быстро не могут, т.к. тогда образуется период и его тоже легко вычислить.
Про криптографическую стойкость таких ГПСЧ говорить нет смысла, но это может быть проблемой и для различных экспериментов со «случайными» данными.
Отличная статья! Теорема Ван дер Вардена чем то похожа на гипотезу (нерешенную) «Erdos discrepancy problem».
Есть бесконечная последовательность из {-1, 1}, гипотеза утверждает, что для любого C, найдется (конечная) однородная арифметическая прогрессия индексов, такая что сумма последовательности по этим индексам >C. Для неоднородного случая гипотеза вроде доказана.
Есть такой проект PolyMath — что то вроде коллективного решения сложных задач. Там эту гипотезу тоже пытались решить, много интересного можно почитать. Например экспериментальные результаты, там пытаются вычислять различные интересные последовательности и значения функций. И многие значения удалось вычислить тоже только для очень маленьких чисел, например масимальные длины последовательностей с определенными ограничениями на суммы.
Кстати, один из экспериментальных результатов по этой гипотезе тоже был получен с помощью SAT-солвера.
a^p == a (mod p) верно при любом a, p — простое.
Если a делится на p, то очевидно a^p == 0^p == 0 == a (mod p). Если не делится, тогда умножим на a обе стороны a^(p-1) == 1 (mod p), получим тоже a^p == a (mod p).
А возможно, позволит взломать сервер. Это кому-нибудь надо? Почему кто то должен полагаться на ваши крипто изыскания?
За ASUSPRO спасибо, заценю. Раньше пользовался только асусами, хотя и были проблемы (быстро дохнут б/п, один раз вымерла матрица, клавиатуры тоже дохнут).
Макбуки не моё. Да и за адекватное железо ценник у них нехилый.
С sha1 у вас получилось hash-then-encrypt. Правильно делать encrypt-then-mac. Сил столько же, зато секурно. Одну из возможных атак я описал выше.
1. Атакер снифает одну сессию. Из неё узнает кусок гаммы (pyra-poster + версия + хедер бинаря + паттерны в бинаре и т.д. и т.д.). Затем выбирает, например, 5й блок шифротекста в качестве «злого» IV.
2. Потом MITMом атакер вклинивается и подсовывает клиенту свой IV (он же rand1). Из структуры AES-CFB следует, что гамма просто «сдвинулась» назад на 5*16 байт. Поэтому атакер может расшифровать ранее неизвестные ему куски бинаря, используя известные ему части гаммы. Более того, он узнаёт новые части гаммы из того же запроса по предыдущей методике и расшифровывает куски из первого запроса.
Затем атакер может перехватывать каждую последующую сессию и подсовывать клиенту тот же IV и вытаскивать данные новых бинарей.
3. Атакеру всё мало, он запрашивает у сервера новый rand1. Отдаёт клиенту свой старый IV для которого он умудрился вычислить большую часть гаммы. Клиент шифрует свой бинарь. Бинарь вышел небольшим, и атакер восстанавливает его весь, а значит он знает его sha1 хэш. Клиент получает «ошибка, рандом протух. перезапустите скрипт». Клиент перезапускает скрипт а атакер подсовывает ему новый, реальный rand1 от сервера. Клиент шифрует тот же бинарь. Но атакер знает теперь всё что после rand0, поэтому узнаёт всю нужную гамму. И допивая рутбир зафигачивает реверс-шелл на сервачок.
PS: В идеале нужно использовать библиотечное Authenticated Encryption. Иначе, самое простое и надежное что можно придумать — encrypt-then-mac (что и является по сути AE, главное именно в таком порядке). Шифруем только бинарь, затем навешиваем (H)MAC. На сервере первым делом проверяем MAC. Для ограничения реплеев можно использовать тот самый «rand1» но ни в коем случае не в качестве IV/параметра шифра, а просто закинуть под HMAC (можно даже не шифровать). Можно обойтись без первого GETa, используя в качестве rand1 таймстамп. Хотя девелоперы могут расстроиться из-за расстроеного времени на сервере.
RSA тут не нужно, т.к. ключ клиент заливает на сервер по защищенному каналу (будем надеяться..). Хотя в качестве подписи это надежнее в том плане, что если кто то читанет исходники на сервере — узнает только публичный ключ.
В какую сторону смотреть?
echo 'Happy new year'
короче же на 1 символ? Да и можно без кавычек:sys.argv[1]
. Если оочень лень вводить кавычки и хочется, чтобы несколько аргументов сливались самим скриптом — делаем" ".join(sys.argv[1:])
. Но основная проблема — экранировать нужно не только пробел. Банальные примеры:; ! () < >
. Так что часть аргументов все равно придется брать в кавычки. Это по поводу bash -> python.Модуль commands Deprecated since version 2.6:. getoutput если и использовать, то только в скриптах для себя. В идееале нужно вызывать subprocess.check_output() с командой в виде списка (если передавать строкой то будет тот же getoutput):
Да, это неудобно, зато аргументы будут переданы корректно и не нужно ничего экранировать. +Нету лишнего вызова bash'а, zenity будет вызван напрямую. +Наверняка есть библиотеки для таких вызовов по типу prepared statements в SQL.
PS: ещё заменчание по регэкспам:
[0-9][0-9][0-9][0-9]
никто не пишет, надо\d{4}
. (Только к строке-регэкспу добавить префикс r, чтобы слеш не утек).Шта?
Автору советую сделать напоминание ;rm -rf /;1 через 15 минут и идти учить питон.
Про криптографическую стойкость таких ГПСЧ говорить нет смысла, но это может быть проблемой и для различных экспериментов со «случайными» данными.
Есть бесконечная последовательность из {-1, 1}, гипотеза утверждает, что для любого C, найдется (конечная) однородная арифметическая прогрессия индексов, такая что сумма последовательности по этим индексам >C. Для неоднородного случая гипотеза вроде доказана.
Есть такой проект PolyMath — что то вроде коллективного решения сложных задач. Там эту гипотезу тоже пытались решить, много интересного можно почитать. Например экспериментальные результаты, там пытаются вычислять различные интересные последовательности и значения функций. И многие значения удалось вычислить тоже только для очень маленьких чисел, например масимальные длины последовательностей с определенными ограничениями на суммы.
Кстати, один из экспериментальных результатов по этой гипотезе тоже был получен с помощью SAT-солвера.
Если a делится на p, то очевидно a^p == 0^p == 0 == a (mod p). Если не делится, тогда умножим на a обе стороны a^(p-1) == 1 (mod p), получим тоже a^p == a (mod p).
(n + 1)^p — n^p — 1 == n + 1 — n — 1 == 0 (mod p) — значит делится нацело на p.