Няшная / Говнокод #5981 Ссылка на оригинал

0

  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 raorn, (Updated )

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

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

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

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

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

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

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

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

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

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8