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

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    int main ()
    {
       char address[128], fname[128], command[128];
       FILE *tempfile;
    
       strcpy(fname , tmpnam(NULL));
       tempfile = fopen (fname, "w");     /* create temporary file */
       if (tempfile == NULL)              /* error - didn't create file */
       {
          printf("Internal failure #1 please report %d\n", errno);
          exit (1);
       }
       fprintf(tempfile, "Thank you very much for caring about our cause\n");
       fprintf(tempfile, "this letter is just to tell you how much we\n");
       fprintf(tempfile, "really think you are wonderful for caring.\n\n");
       fprintf(tempfile, "Sincerely,\n\n");
       fprintf(tempfile, "Jane Doe, Executive Thanker\n");
    fclose (tempfile);
       gets(address);                            /* read in email address */
    
       sprintf(command, "mail -s \"thanks for caring\" %s < %s\n",
               address, fname);                /* create the command */
       system (command);                       /* execute command */
       remove (fname);                         /* clean up */
       exit (0);
    }

    Игра: найди вулна.

    Запостил: JloJle4Ka, 03 Февраля 2023

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

    • Ну что, никто не может?
      Ответить
    • Первая проблема:
      L_tmpnam вполне может быть больше 128 и тогда строка 9 может распидорасить стек.

      Вторая проблема:
      Строка 10 — TOCTOU, используй tmpfile, блджад.
      Ответить
      • Серьёзно, временный файл для ЭТОГО?

        gets может распидорасить стек на длинных адресах.

        sprintf тоже распидорасит стек скорее всего.

        system(command)
        дальше не читал. system с пользовательским вводом. Тут даже mysql_real_escape_strings не вызвали, так запихали.
        Ответить
    • временные файлы не могут быть длинее 128 байт, это же очевидно

      а почему это говно не на баше?
      Ответить
    • Чиво, блять?
      Ответить
    • я мог бы предложить вместо сишных приблуд вроде strcpy, fopen и прочих юзать платформенные плашки, где этот вопрос уже давно решен. Это позволит избежать ебли с потусторонними либами, где дела, как правило, обстоят ещё хуже.

      Самая главшая лажа - пытаться сделать код кросскомпилируемым. Не стоит растягивать свой анус, пытаясь сделать код кросскомпилируемым. Стоит юзать апи конкретно той операционки, под которую конкретно пишешь данный софт.
      Ответить

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