Нет, компиляторами ничего не игнорируется просто так, inline сейчас имеет просто другой смысл (выше написали про линковку), и к встраиванию не имеет никакого отношения. По-хорошему просто так его писать не нужно, иначе можно случайно замаскировать multiple definition error, который обычно выстрелит на линковке.
Запрос Double Click в принципе довольно странен и может насторожить (да и кто читает инструкции к капче?). Проще сделать вид, что кнопка "залипла" и не нажимается, и подменять окна только после нескольких яростных кликов (да — лаунчеры, меняющие фокус, я смотрю на вас с презрением и негодованием).
Выполняется. В демо видно, что после нажатия "Start Here" фейковая кнопка не активна в течение некоторого таймера — в это время, вероятно, под видимым окном грузится страница атакуемого сайта. В описании атаки тоже это проговаривается (не совсем очевидно, правда).
В самой статье сильно не хватает описания инструментария, доступного ИИ (хоть вы и ответили в комментарии выше, почему бы сразу не приложить этот промт в самой статье для желающих повторить эксперимент). Если ИИ доступен execute_code, то простор для решений довольно большой, вплоть до полного слома хостовой системы эксплоитами и прописывания себя в UEFI, например.
если представить элементы поля не в виде чисел, а в виде кортежей
Тогда это уже будет не поле целых чисел, а поле таких "кортежей" (кажется, полностью идентичное полю рациональных чисел). Вопрос просто в определении: по определению поля, множество целых чисел не является полем, так как частное от деления целых чисел может не принадлежать множеству целых чисел.
А, ну да, позволит, а рарчик просто открывался :) В статье ещё описывается использование WebRTC по UDP, у него тоже нет аналога CORS-ограничений вроде как.
Во-первых, открывать голые TCP/UDP соединения браузер всё-таки не позволит (если только через расширения конкретного браузера).
Однако, http-запросы из JS куда угодно разрешены, НО! CORS не позволит прочитать ответ внутри JS, если в ответе нет явного заголовка Access-Control-Allow-Origin: XXX. Да, в wireshark очень чётко видны открывающиеся TCP-сессии, запросы от браузера и радостные ответы локальных сервисов. Тем не менее:
остаётся возможность атаки по стороннему каналу (например, замеряем время запроса к http://127.0.0.1:5432 — косвенно понимаем, работает Postgres у пользователя локально или нет);
банально, всё ещё можно отправить запросы вида PUT http://192.168.0.1/login?user=admin&password=admin&set_dns=99.99.99.99 (зависит от API слушающих сервисов) — ответ нам вообще не важен, мы просто в лоб передаём в запросе нужную информацию слушающему сервису. Именно такой вектор обмена информацией рассматривается в статье.
Для меня лично стало неприятным сюрпризом, что
даже в современных браузерах есть возможность напрямую из песочницы обращаться к локальной сети и выполнять такой жирным пласт запросов (пусть и чаще всего односторонних);
и что CORS всего навсего блокирует ответы, но не запросы (что логично, но требует осознания).
Кстати, эту стереопару вполне можно рассмотреть и в миниатюрном варианте из статьи) Ну и да, она, в отличие от остальных фото в статье, предназначена для метода параллельного взгляда, а не перекрёстного.
Немного дополню озвученные ответы: да, "сила" объёмности зависит от т.н. стереобазы, то есть расстояния между фотоприёмниками (зрачками, объективами стереокамеры/бинокля и пр.). С помощью изменения этого расстояния в VR-приложениях настраивается масштаб сцены относительно пользователя: например, по умолчанию в Google Earth VR мир кажется игрушечным, потому что расстояние между камерами рендеринга равно десяткам/сотням метров, но активация режима "Human Scale" выставляет стереобазу в единицы-десятки сантиметров, что сразу меняет масштаб мира.
Увы, слишком короткая стереобаза (~6 см, межзрачковое расстояние) хоть и должна верно передавать масштаб, но делает два отрендеренных изображения слишком слабо различающимися, что при недостаточном разрешении дисплеев приводит к проблеме "плоской" сцены без параллакса — как в старых игрушках, когда пейзажи запекались в текстуру и натягивались на плоскость.
Так аналитическое решение само по себе торт! Можно предельный переход сделать c → ∞ (спойлер: да, приходим к классическим формулам), можно g покрутить (чёрная дыра), или m занулить (нейтрино, фотон… ну тут конечно погорячился).
Прошу помощи зала: помнится, на Хабре было несколько похожих статей, где рассматривался вопрос поиска некоего алгоритма брутфорсом опкодов миниатюрной ВМ. Так вот, не могу найти статью, в которой рассказывалось, как искалась "программа", помещавшаяся в 64-битное число (внутри которого кодировались инструкции стековой машины в обратной польской нотации), собственно перебором всех 64-битных чисел. Может, кто-то помнит эту статью или хотя бы волшебные слова из неё?
Чиселка с деньгами — это чаще всего всё равно будет какой-нибудь uint64_t, хоть он внутри Integer внутри Object, хоть он внутри struct Wallet внутри struct MyCharacter. А значит, этот кусок памяти можно отыскать. Кроме того, состояние типа "money" обычно какое-то глобальное или по крайней мере не пересоздающееся постоянно, значит, сборщиком оно не разрушится (например, ссылка на "money" опосредованно должна быть у рендерера или у планировщика, пинающего рендерер).
Хороший разбор и примеры. Интересно, что материал неявно затрагивает ещё одну важную тему: SCEV Evaluation является прекрасным примером оптимизации, честно полагающейся на отсутствие UB (undefined behavior) в исходном коде. Мы применяем матаппарат на множестве целых чисел, чтобы вывести некоторые результирующие формулы, но они с большой вероятностью перестают работать, если допустить целочисленное переполнение на итерациях суммирования (однако, не исключено, что формулы справедливы в арифметике по модулю 2⁶⁴, например).
— не оторвётся ли случайно (или скорее наоборот останется) какой-нибудь слэш / в relative-пути, если передать path без завершающего слэша? Зависит, конечно, от того, как именно path доходит до сюда.
UPD: ну и в принципе смешивание std::string и fs::path для навигации звучит довольно взрывоопасно, вроде API fs должно хватать для всех GetRelative и т.д., но он ещё и нормализует пути.
Да, вот только не стоит забывать, что отсчёт у нас идёт от абсолютного нуля 0K (-273°C), поэтому радиатор 90°C излучает сильнее радиатора 20°C всего в ((273+90)÷(273+20))⁴ ~ 2.3 раза сильнее.
Не совсем так, для передачи энергии излучением достаточно просто разности температур и способности поглощать определённые длины волн. Все тела излучают (см. Закон Стефана — Больцмана), и примерно пропорционально ~T⁴, но другое дело, что входящие и исходящие потоки могут быть равны.
Но да, от проца до радиатора ПК больше тепла передаётся теплопроводностью, а от радиатора воздуху — конвекцией.
Нет, компиляторами ничего не игнорируется просто так,
inline
сейчас имеет просто другой смысл (выше написали про линковку), и к встраиванию не имеет никакого отношения. По-хорошему просто так его писать не нужно, иначе можно случайно замаскировать multiple definition error, который обычно выстрелит на линковке.Запрос Double Click в принципе довольно странен и может насторожить (да и кто читает инструкции к капче?). Проще сделать вид, что кнопка "залипла" и не нажимается, и подменять окна только после нескольких яростных кликов (да — лаунчеры, меняющие фокус, я смотрю на вас с презрением и негодованием).
Выполняется. В демо видно, что после нажатия "Start Here" фейковая кнопка не активна в течение некоторого таймера — в это время, вероятно, под видимым окном грузится страница атакуемого сайта. В описании атаки тоже это проговаривается (не совсем очевидно, правда).
В самой статье сильно не хватает описания инструментария, доступного ИИ (хоть вы и ответили в комментарии выше, почему бы сразу не приложить этот промт в самой статье для желающих повторить эксперимент). Если ИИ доступен
execute_code
, то простор для решений довольно большой, вплоть до полного слома хостовой системы эксплоитами и прописывания себя в UEFI, например.Тогда это уже будет не поле целых чисел, а поле таких "кортежей" (кажется, полностью идентичное полю рациональных чисел). Вопрос просто в определении: по определению поля, множество целых чисел не является полем, так как частное от деления целых чисел может не принадлежать множеству целых чисел.
А, ну да, позволит, а рарчик просто открывался :) В статье ещё описывается использование WebRTC по UDP, у него тоже нет аналога CORS-ограничений вроде как.
Ответ сложнее и интереснее, чем может показаться.
Во-первых, открывать голые TCP/UDP соединения браузер всё-таки не позволит (если только через расширения конкретного браузера).
Однако, http-запросы из JS куда угодно разрешены, НО! CORS не позволит прочитать ответ внутри JS, если в ответе нет явного заголовка
Access-Control-Allow-Origin: XXX
. Да, в wireshark очень чётко видны открывающиеся TCP-сессии, запросы от браузера и радостные ответы локальных сервисов. Тем не менее:остаётся возможность атаки по стороннему каналу (например, замеряем время запроса к
http://127.0.0.1:5432
— косвенно понимаем, работает Postgres у пользователя локально или нет);банально, всё ещё можно отправить запросы вида
PUT http://192.168.0.1/login?user=admin&password=admin&set_dns=99.99.99.99
(зависит от API слушающих сервисов) — ответ нам вообще не важен, мы просто в лоб передаём в запросе нужную информацию слушающему сервису. Именно такой вектор обмена информацией рассматривается в статье.Для меня лично стало неприятным сюрпризом, что
даже в современных браузерах есть возможность напрямую из песочницы обращаться к локальной сети и выполнять такой жирным пласт запросов (пусть и чаще всего односторонних);
и что CORS всего навсего блокирует ответы, но не запросы (что логично, но требует осознания).
Кстати, эту стереопару вполне можно рассмотреть и в миниатюрном варианте из статьи) Ну и да, она, в отличие от остальных фото в статье, предназначена для метода параллельного взгляда, а не перекрёстного.
Немного дополню озвученные ответы: да, "сила" объёмности зависит от т.н. стереобазы, то есть расстояния между фотоприёмниками (зрачками, объективами стереокамеры/бинокля и пр.). С помощью изменения этого расстояния в VR-приложениях настраивается масштаб сцены относительно пользователя: например, по умолчанию в Google Earth VR мир кажется игрушечным, потому что расстояние между камерами рендеринга равно десяткам/сотням метров, но активация режима "Human Scale" выставляет стереобазу в единицы-десятки сантиметров, что сразу меняет масштаб мира.
Увы, слишком короткая стереобаза (~6 см, межзрачковое расстояние) хоть и должна верно передавать масштаб, но делает два отрендеренных изображения слишком слабо различающимися, что при недостаточном разрешении дисплеев приводит к проблеме "плоской" сцены без параллакса — как в старых игрушках, когда пейзажи запекались в текстуру и натягивались на плоскость.
Почему-то прямо с порога некорректный ответ (
clang-trunk -O0
):На
-O1
и выше всё норм. UB таки стреляет?Для интересующихся — отличный перевод статьи 2018 года на Хабре про эту же технику:
Иллюзия пространства: как новый Spiderman рендерит помещения без геометрии
Так аналитическое решение само по себе торт! Можно предельный переход сделать c → ∞ (спойлер: да, приходим к классическим формулам), можно g покрутить (чёрная дыра), или m занулить (нейтрино,
фотон… ну тут конечно погорячился).Прошу помощи зала: помнится, на Хабре было несколько похожих статей, где рассматривался вопрос поиска некоего алгоритма брутфорсом опкодов миниатюрной ВМ. Так вот, не могу найти статью, в которой рассказывалось, как искалась "программа", помещавшаяся в 64-битное число (внутри которого кодировались инструкции стековой машины в обратной польской нотации), собственно перебором всех 64-битных чисел. Может, кто-то помнит эту статью или хотя бы волшебные слова из неё?
Чиселка с деньгами — это чаще всего всё равно будет какой-нибудь
uint64_t
, хоть он внутриInteger
внутриObject
, хоть он внутриstruct Wallet
внутриstruct MyCharacter
. А значит, этот кусок памяти можно отыскать. Кроме того, состояние типа "money" обычно какое-то глобальное или по крайней мере не пересоздающееся постоянно, значит, сборщиком оно не разрушится (например, ссылка на "money" опосредованно должна быть у рендерера или у планировщика, пинающего рендерер).Френдлифаер круто, ещё и стратегию меняет: по функции, названной противником, можно сделать предположения, куда он не хочет попасть сам.
Хороший разбор и примеры. Интересно, что материал неявно затрагивает ещё одну важную тему: SCEV Evaluation является прекрасным примером оптимизации, честно полагающейся на отсутствие UB (undefined behavior) в исходном коде. Мы применяем матаппарат на множестве целых чисел, чтобы вывести некоторые результирующие формулы, но они с большой вероятностью перестают работать, если допустить целочисленное переполнение на итерациях суммирования (однако, не исключено, что формулы справедливы в арифметике по модулю 2⁶⁴, например).
— не оторвётся ли случайно (или скорее наоборот останется) какой-нибудь слэш
/
в relative-пути, если передатьpath
без завершающего слэша? Зависит, конечно, от того, как именноpath
доходит до сюда.UPD: ну и в принципе смешивание
std::string
иfs::path
для навигации звучит довольно взрывоопасно, вроде APIfs
должно хватать для всехGetRelative
и т.д., но он ещё и нормализует пути.Да, вот только не стоит забывать, что отсчёт у нас идёт от абсолютного нуля 0K (-273°C), поэтому радиатор 90°C излучает сильнее радиатора 20°C всего в
((273+90)÷(273+20))⁴ ~ 2.3
раза сильнее.Не совсем так, для передачи энергии излучением достаточно просто разности температур и способности поглощать определённые длины волн. Все тела излучают (см. Закон Стефана — Больцмана), и примерно пропорционально
~T⁴
, но другое дело, что входящие и исходящие потоки могут быть равны.Но да, от проца до радиатора ПК больше тепла передаётся теплопроводностью, а от радиатора воздуху — конвекцией.
Хорошо б ещё ссылку приложить, на Хабре есть замечательная статья про это:
Сверхлёгкие частицы размером с галактику (https://habr.com/ru/company/ruvds/blog/696254/)