1. Си / Говнокод #5981

    +132

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    if (argc == 3)
        snprintf(outfile, sizeof(outfile) - 1, "scan.log", argv[1], argv[2]);
    else if (argc >= 4)
    {
        snprintf(outfile, sizeof(outfile) - 1, "scan.log", argv[1], argv[3], argv[2]);
        // ...
    }

    Какой-то иксплойт, файл pscan2.c

    Запостил: raorn, 14 Марта 2011

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

    • По ходу бы надо заюзать va_arg и ежи с ними
      Ответить
    • Нет тут никакого эксплоита. Есть просто бредовый говнокод. Код формально "корректен", т.к. ничего нелегального в передаче лишних аргументов в `snprintf` нет. Лишние аргументы будут просто проигнорированы.

      Подозреваю, что когда-то имя файла зависело от `argv`, а потом кому-то надоело трахаться с кривыми именами фалов (которые неизбежно будут получаться при таком примитивном подходе) и они просто жестко прошили имя "scan.log" для всех случаев. А мертвые теперь аргументы или просто забыли вычистить, или сознательно оставили, на случай если в будущем захочется вернуться к прежнему варианту.
      Ответить
      • 1. читайте стандарт
        2. возможно имелось в виду, что код из эксплойта
        3. еще раз стандарт
        4...
        Ответить
        • Вряд ли кто-то здесь в состянии хотя бы отдаленно сравниться со мной в знании стандарта языка С. Поэтому я еще раз условно повторю то, что сказал выше. А также осмелюсь поинтересоваться, что же вы имеете в виду, под вашим игриво-туманным "читайте стандарт".
          Ответить
          • Конечно же я не посягаю на ваше знание стандарта и уж темболее, не намерен с вами в нем сравниваться, но позвольте поинтересоваться, какие аргументы у snprintf в этом говнокоде лишние с точки зрения стандарта?
            Ответить
            • Хм... "Лишними" в данном случае являются все `argv[i]` аргументы.
              Ответить
              • ссылку в студию!
                Ответить
                • http://www.govnokod.ru/5981#comment78098
                  Ответить
                • Ссылку на что именно??? Я, честно говоря, не совсем понимаю, что именно вызывает у вас затруднения, не говоря уже о том, что парой сообщений ниже вопросов вроде не возникало.
                  Ответить
                  • Что вы! Никаких затруднений.
                    Я подумал было, что вы действительно можете указать мне место в стандарте, где сказано "игнорируемые параметры функции являются лишними".

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

                    И да, это то, что я имел в виду, написав вам про стандарт.
                    Ответить
                    • Ну, вообще говоря, слова "игнорируемые" и "лишние" для меня в данном контексте - синонимы. Поэтому я не понимаю загвоздки.
                      Ответить
    • C99:
      int snprintf(char * restrict s, size_t n, const char * restrict format, ...);

      дискардит все, что больше n-1. а вот
      "scan.log"
      на строку форматирования нифига не похоже.
      Ответить
      • Насчет "дискардит все, что больше n-1" - это хорошее замечание. Действительно, можно было просто написать `sizeof outfile` без вычитания единицы.

        А вот что Вам показалось "похоже", а что "не похоже" мало кому интересно. Читайте стандарт - там ясно английским по белому написано, что такое строка форматирования и как она обрабатывается. Строка "scan.log" является совершенно корректной строкой форматирования. А то, что такая строка форматирования выглядит странно в вышеприведенном контексте (с передаваемыми "лишними" аргументами) - так возможную причину возникновения такой ситуации я детально описал выше.

        По существу замечания есть?
        Ответить
        • Действительно так.
          Ни разу не сталкивался. Или сталкивался но не обращал внимания.

          Замечательно что на ГК сидят не только похапешники. Си Хайль!
          Ответить
          • ПХПшники заминусовали этот комментарий.
            Даёшь равноправие! Долой однопартийную систему! Си - в массы!
            Ответить

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