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

    −13

    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
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h> 
    
    void secret(void) __attribute__ ((used,noinline,noreturn));
    void brainfuck(void) __attribute__ ((noinline));
    int main(void);
    
    void secret(void)
    {
      printf ("You win!\n");
      exit(0);
    }
    
    char *bfprog = "+++---";
    
    void brainfuck(void)
    {
        char *bfprog_p = bfprog;
        unsigned long long i;
        unsigned char arr[500] = {0};
        arr[499] = ( ((uintptr_t)secret ^ (uintptr_t)main) & 0xffffff00 ) >> 8*0;
        arr[0]   = ( ((uintptr_t)secret ^ (uintptr_t)main) & 0xffff00ff ) >> 8*1;
        arr[498] = ( ((uintptr_t)secret ^ (uintptr_t)main) & 0xff00ffff ) >> 8*2;
        arr[1]   = ( ((uintptr_t)secret ^ (uintptr_t)main) & 0x00ffffff ) >> 8*3;
        unsigned char *arr_p = &arr[249];                  
        for (i = 0;; i++)
        {
            switch (*bfprog_p)
            {
                case '>':
                    arr_p++;
                    break;
                case '<':
                    arr_p--;
                    break;
                case '+':
                    (*arr_p)++;
                    break;
                case '-':
                    (*arr_p)--;
                    break; 
    /*           case '.':
                    putchar(*arr_p);
                    break;
                case ',':
                    *arr_p = getchar();
                    break;                   нинужно*/
                case '[':
                    if (*arr_p == 0 )
                    {
                        unsigned long long bracketcount = 0;
                        do
                        {
                          if (*bfprog_p == '[')
                              bracketcount++;
                          else if (*bfprog_p == ']')
                              bracketcount--;
                          bfprog_p++;
                        } while (bracketcount != 0);
                        bfprog_p-=1;
                    }
                    break;
                case ']': 
                    if (*arr_p != 0 )
                    {
                        unsigned long long bracketcount = 0;
                        do
                        {
                          if (*bfprog_p == ']')
                              bracketcount++;
                          else if (*bfprog_p == '[')
                              bracketcount--;
                          bfprog_p--;
                        } while (bracketcount != 0);
                    }
                    break;
                default: return;
            }
            bfprog_p++;
        }
        return;
    }
    
    int main(void)
    {
        brainfuck();
        return 0;
    }

    Задача - подставить в char *bfprog такую строку, чтобы запустилась функция secret(). Менять что-либо еще в коде запрешено. Платформа - 32битные интели, компилятор - гцц. ОС - линукс или виндовс, на ваше усмотрение (хотя разницы по-идее не будет). Предполагаем, что тут применяется особо расширенный и улучшенный ASLR который при каждом запуске перетасовывает размещение функций, и secret от main находится на хуй знает каком расстоянии. Победившему - нихуя

    Запостил: j123123, 27 Февраля 2017

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

    • Да ну нахуй этот брейнфак, придумай че поинтереснее
      Ответить
      • Не, я конечно могу придумать свой байткод для какого-нибудь фортоподобного говна и интерпретатор к нему (можно даже с фон-неймановской архитектурой, где код и данные в одном месте) но тут возникает вопрос, будет ли кто-то на этом форте дейсвительно что-то писать в его машинных кодах, чтобы мне не было жаль времени, потраченного на этот самый форт
        Ответить
      • И да, эта задача на самом деле довольно простая если решать в лоб, самое сложное это xor на брейнфаке написать, но его можно при желании нагуглить уже готовый
        Ответить
      • это потому что ты анскиллябра заедушная, не могущая в брейнфак
        Ответить
    • Я требую продолжения банкета!
      Ответить
    • >>unsigned char arr[500]
      мда
      в наше время стек не жалеют

      в моем децтве за 500 байт на стеке могли и в морду дать
      Ответить
      • Вроде 4 мб по дефолту. 500 байт - копейки.

        петухайкер забанил мой аккаунт, так что теперь я буду бароп
        Ответить
        • в виндовом линкере 1 мегабайт

          конечно копейки, но в моем децтве были такие мемори модели что под стек могло выделяться 64К
          Ответить
          • На самом деле и сейчас в некоторых случаях это могут быть не копейки. В области веббекендов в тренде зеленые потоки, которых могут быть сотни тысяч или даже миллионы. В этом случае слишком жадная функция может привести к выделению дополнительной страницы под стек, что при таком количестве потоков обернется в гигабайты памяти.
            Ответить
            • >>миллионы
              Это какой-то очень серьезный хайлоад
              А нельзя их на разные сервера перенести?
              Ответить
              • Можно. Покупаешь больше серверов @ переносишь.
                Ответить

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