Кресты / Говнокод #26598 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 gost, (Updated )

Комментарии (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/С++

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

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

                Грустно это всё.
                Ответить
                • > Кто-то не умеет, кто-то умеет но выёбывается, кто-то просто вечером устал и концентрации не хватило.
                  - каким программистом на С++ будешь сегодня ты?
                  Ответить
              • блюющий единорог доказал, что в любом коде на си и на крестах куча тупых ошибок и опечаток, даже в ядре линукса например
                Ответить
                  • В «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.
        Ответить
    • чтобы потом туда что-то писнуть

      клиент метода думал что конст, и передал туда строковой литерал
      и соснул
      ахахаха
      Ответить

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

Помни, guest, за тобой могут следить!

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


    8