1. C++ / Говнокод #26598

    +1

    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
    char *CHudTextMessage::LocaliseTextString( const char *msg, char *dst_buffer, int buffer_size )
    {
    	char *dst = dst_buffer;
    	for ( char *src = (char*)msg; *src != 0 && buffer_size > 0; buffer_size-- )
    	{
    		if ( *src == '#' )
    		{
    			// cut msg name out of string
    			static char word_buf[255];
    			char *wdst = word_buf, *word_start = src;
    			for ( ++src ; *src >= 'A' && *src <= 'z'; wdst++, src++ )
    			{
    				*wdst = *src;
    			}
    			*wdst = 0;

    Тут недавно слили исходники «Team Fortress 2» и «Counter Strike: Global Offense» — и в соответствующих местах начался вой игроков: кошмар, мы все умрём, нас всех взломают!

    Запостил: gost, 23 Апреля 2020

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

    • Очень смешно наблюдать за людьми, которые искренне считают, что закрытый код — это надёжная защита от хакеров, а если его сольют — то всё, пиздец, хакеры всех взломают.

      Ещё смешнее наблюдать за тем, что после слива хакеры действительно всех ломают: https://i.imgur.com/Q9FedYy.png, и в TF2 уже нашли кучку RCE (в посте не RCE, а просто рандомное переполнение буфера, которое я нашёл за пять минут просмотра сорцов).

      Казалось бы, при чём здесь опенсорс?..
      Ответить
      • А как можно использовать переполнение статического буфера?
        Ответить
        • Затереть лежащие за ним статические объекты, в которых могут оказаться какие-нибудь указатели на функции, к примеру.
          Ответить
        • Как минимум — можно крашнуть клиент. Как максимум — за этим буфером будут лежать какие-то важные данные, перезапись которых может привести к непредсказуемым последствиям, вплоть до RCE (например, если там будет удачно лежать какой-нибудь объект с таблицей виртуальных функций).
          Ответить
      • Секьюрити
        Сру
        Обскьюрити
        Ответить
      • >static char word_buf[255];

        Такой код в принципе не сулит ничего хорошего.
        Ответить
      • В опенссл, блядь, 100 лет не могли найти чтение памяти. Ну АНБ-то могло найти, только оно об этом не расскажет.
        Ответить
        • именно потому я за либрессл
          Ответить
          • В котором такое не могло произойти? Или что?
            Ответить
            • libressl меньше, чище, и написан фанатиками безопасности ровно потому, что в openssl запутанный, сложный, и (соответственно) с багами
              Ответить
        • Обожемой, да всем насрать!
          Ответить
      • Я в одной игре нашел переполнение буфера (моя строка попадает в IP). Как его заюзать?
        Ответить
    • > char *src = (char*)msg

      Нахуя?! Не пишут же туда ничего. Чтобы потом == и = попутать и таки что-то туда записать?
      Ответить
      • Какой C/C++ )))
        Ответить
        • > C/С++

          Да не говори. В 99% случаев, заметив работу со строками или путями в си или крестах, можно найти RCE или хотя бы краш.
          Ответить
          • вообще ексли это ++, то там же есть const_cast, не? зачем низкоуровнивания питушня?
            и вообще откуда char* в С++ в 2020?
            Ответить
            • Да даже в крестах проёбов с итераторами немеряно.
              Ответить
              • Это что, никто не умеет писать на крестах?
                Ответить
                • Кто-то не умеет, кто-то умеет но выёбывается, кто-то просто вечером устал и концентрации не хватило. Результат одинаковый.

                  Вот, казалось бы, банальная задачка - проверить, что тег есть в списке тегов, разделённых запятой. Чтение за границей буфера, кровь-кишки, RCE рандомный ответ.

                  Грустно это всё.
                  Ответить
                  • > Кто-то не умеет, кто-то умеет но выёбывается, кто-то просто вечером устал и концентрации не хватило.
                    - каким программистом на С++ будешь сегодня ты?
                    Ответить
                • блюющий единорог доказал, что в любом коде на си и на крестах куча тупых ошибок и опечаток, даже в ядре линукса например
                  Ответить
                  • Именно поэтому я за «PHP».
                    Ответить
                    • В «PHP» любой код по-умолчанию является тупой ошибкой и опечаткой.
                      Ответить
                    • А я за JS. В JS как-то проще выглядит. Пока в сишке пердолишь ручной код, в крестах инклюдишь бусторегулярки, в питоне разбираешься с импротом и порядком аргументов, в пхп вводишь длинные беременные функции, в жс быстро и просто пишешь: 'питух'.replace(/тух/g, 'линух')
                      Ответить
            • > и вообще откуда char* в С++ в 2020?
              Это просто древний «C++» образца года эдак 2005-го.
              Ответить
              • Судя по (char*) это такой с++, в котором даже кастов нет.
                1985-го, может
                Ответить
                • Это же тот самый "C/C++", знание которого требуется многим конторам.
                  Ответить
      • А хуй знает.
        char *CHudTextMessage::LocaliseTextString( const char *msg, char *dst_buffer, int buffer_size )
        {
        	char *dst = dst_buffer;
        	for ( char *src = (char*)msg; *src != 0 && buffer_size > 0; buffer_size-- )
        	{
        		if ( *src == '#' )
        		{
        			// cut msg name out of string
        			static char word_buf[255];
        			char *wdst = word_buf, *word_start = src;
        			for ( ++src ; *src >= 'A' && *src <= 'z'; wdst++, src++ )
        			{
        				*wdst = *src;
        			}
        			*wdst = 0;
        
        			// lookup msg name in titles.txt
        			client_textmessage_t *clmsg = TextMessageGet( word_buf );
        			if ( !clmsg || !(clmsg->pMessage) )
        			{
        				src = word_start;
        				*dst = *src;
        				dst++, src++;
        				continue;
        			}
        
        			// Does titles.txt want to lookup into cstrike_<language>.txt?
        			wchar_t *pLocalizedStr;
        			if ( clmsg->pMessage[0] == '#' && ((pLocalizedStr = g_pVGuiLocalize->Find( clmsg->pMessage )) != NULL ) )
        			{
        				g_pVGuiLocalize->ConvertUnicodeToANSI( pLocalizedStr, dst, buffer_size );
        			}
        			else
        			{
        				// copy string into message over the msg name
        				for ( char *wsrc = (char*)clmsg->pMessage; *wsrc != 0; wsrc++, dst++ )
        				{
        					*dst = *wsrc;
        				}
        				*dst = 0;
        			}
        		}
        		else
        		{
        			*dst = *src;
        			dst++, src++;
        			*dst = 0;
        		}
        	}
        
        	//
        // ensure null termination
        	dst_buffer[buffer_size-1] = 0; 
        	return dst_buffer;
        }
        Ответить
        • Да тут и динамический dst_buffer переполнить могут, не только статический word_buf. Хер знает какой там длины это clmsg->pMessage.
          Ответить
      • чтобы потом туда что-то писнуть

        клиент метода думал что конст, и передал туда строковой литерал
        и соснул
        ахахаха
        Ответить
    • >static char word_buf[255];
      питух видит импилист знание
      Ответить
    • Какой С++ )))Кстати сходу не вижу где ++?
      Ответить

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