Переполнение буфера

Материал из Неолурк, народный Lurkmore
Перейти к навигации Перейти к поиску

Переполнение буфера — печальная ситуация, когда данные оказываются восраны за пределы буфера и оказываются утрачены.

Куда-куда пшол?

Описание[править]

Когда объём записываемых данных превышает ёмкость буфера, избыточная информация перезаписывает соседние участки памяти, что приводит к непредсказуемому поведению программы. Это весьма популярная ошибка, связанная со слабой квалификацией программиста или использованием вибе-кодинга, который совмещает разные коды как кто горазд, особенно такой херовый кодер, как Claude.

Оно возникает преимущественно в языках низкого уровня, таких как C и C++, где отсутствует встроенная проверка границ массивов, а управление памятью осуществляется напрямую. В результате злоумышленник может не только вызвать сбой программы, но и зачастую выполнить произвольный машинный код, так что на самом деле сия ошибка является весьма опасной епта.

Да. Переполнение буфера в стеке позволяет перезаписать адрес возврата и перенаправить выполнение на код злоумышленника.

Именно на этой ошибке паразитировал вонючий червь Морриса, который работал через переполнение буфера в сервисе finger операционной системы Unix (функция gets()). Червь заразил тысячи компьютеров ARPANET, в общем-то хорошо поползал епта.

В 2001 году червь Code Red использовал переполнение в Microsoft Internet Information Services, заразив сотни тысяч серверов. В 2003 году SQL Slammer поразил Microsoft SQL Server 2000, вызвав глобальные сбои в интернете. Аналогичные уязвимости позволили запускать неофициальное ПО на игровых консолях, то есть работали в общем-то на благо, позволяя обходить ограничения вредителей.

Переполнение происходит, когда программа копирует данные без проверки их длины. В языках вроде C функции strcpy(), gets(), scanf() и им подобные не выполняют проверку границ, что собственно и приводит к плохо пахнущим и хрюкающим проблемам.

Movax1010h.png Глубокий смысл скрыт в этих неестественных языках
Языки программированияПромышленные: BATC#CC++JavaJavaScript (AJAX) • PascalPerlPHPPythonRubyABAPАссемблерВасикFortran (Профессор)
Эзотерические: BrainFuckHQ9++ErlangForthHaskellLISP (My other car) • PrologTclΤΕΧOracleMySQLGolangВ++ScalaH и Ё+Программист-бетонщик
ПрофессииБыдлокодерПрограммистТестировщикХакерХеллоуворлдщикIT-звёздыПрограммист (существо)Тернарный операторUnreal MCPИсходный кодSingle-Page ApplicationGiteaForgejoCephIDEДжуниорРепозиторийPostgreSQLSQLiteJQueryБуферWebGLПереполнение буфераХардкод
Методы и стилиReverse EngineeringАнти-паттернВыстрелить себе в ногуГрязный хакКод (индусский) • КостыльМетод научного тыкаПомолясьСвистелки и перделкиОчередьСпортивное программированиеОбфускацияБета-тестАльфа-тестШаблоныRegReplaceФреймворкБыдлокодIndex.phpОхота за жукамиКуМирКлеточный автоматПроцедурное программированиеПоиск файлов в Unix по содержимомуPetoohФункция активации нейронаПерегрузка операторов в PythonЗерокодинг
Средства разработкиSublime TextПодсветка синтаксиса кодаUnstable DiffusionAPIPythonTutorCodeWarsDataCampUnity3DКнижный PythonMallocСвязный списокSOLIDООПУказательNULLWeLang++XenonRecompFuse.jsОптимизацияТестированиеAmbreon866Реверс-инжинирингКроссплатформенностьJSON
ЛюдиИлья КанторЮрий КлючевскийЭдуард ЛаасЭдвард СноуденСеймур ПейпертПроблемаK!ockyTypeScriptОтладчикБитЭффективный менеджер (IT)TauriReact NativeWindows APIТипPyTorchTensorFlowПарсерNode.jsFastAPIVue.jsSvelteБэкендElectronBroken Object Level AuthorizationМаппингДжастин ФранкельHex-редакторVisual Basic .NETNext.jsDocker ComposeNode modulesIndexedDB
Прочее++i + ++iДедлайн%s640 килобайтCMSDummy modeЕГГОГFoobarGod is real, unless explicitly declared as integerGOTOIfconfigKISSRegExpSICPsql.ruXyzzyДискетаИнжалид дежицеКОИ-8ЛогМанРекурсияСУБДТест ТьюрингаУмение разбираться в чужом кодеФаза ЛуныФатальный недостатокПроблема 2000ТаймстампКэшЗапись в файл без кэша (Perl)Танцы с бубномКодачХукCurl cffiВибе-кодингFlutterАппликативный оператор