eXeL@B —› Вопросы новичков —› Переполнение только в strcpy? |
Посл.ответ | Сообщение |
|
Создано: 31 марта 2018 13:55 · Личное сообщение · #1 |
|
Создано: 31 марта 2018 18:42 · Личное сообщение · #2 |
|
Создано: 31 марта 2018 19:04 · Личное сообщение · #3 |
|
Создано: 31 марта 2018 19:14 · Поправил: hors · Личное сообщение · #4 alex-rudenkiy пишет: Здравствуйте, скажите пожалуйста, такой вопрос, вот я смотрю такую тему как "Переполнение буфера" и в 99.9% случаев приводят winapi'ную подпрограмму strcpy и вот хочу спросить, больше не существует мест уязвимых под переполнение буфера, а если есть то какие наиболее известные подходы их нахождения? Любая функция которая работает с буфером теоретически может быть причиной переполнения если буфер неправильно выделен. ----- http://ntinfo.biz | Сообщение посчитали полезным: sefkrd |
|
Создано: 31 марта 2018 21:57 · Личное сообщение · #5 alex-rudenkiy Это лишь самый простой пример, строковая линейная запись в буфер. Или вам обучалки нужны на ядерных функциях, в которых чёрт ноги поломает Добавлено спустя 17 минут > есть то какие наиболее известные подходы их нахождения? Этим вопросом не только вы интересуетесь Это называется OP-атаками. Обьектом таких атак являются алгоритмические ошибки. Проверки статического буфера сам компилер выполняет. Ошибки в алгоритмах находятся только по крэшам или человеческим анализом кода. Инструмента нет, это очень сложная и не решённая задача. ----- vx |
|
Создано: 01 апреля 2018 01:55 · Поправил: dosprog · Личное сообщение · #6 alex-rudenkiy пишет: приводят winapi'ную подпрограмму strcpy winapi'ную?.. alex-rudenkiy пишет: больше не существует мест уязвимых под переполнение буфера, а если есть то какие наиболее известные подходы их нахождения? Стресс-тестирование. А наиболее частая и неприятная ошибка - это т.н. "+/-1", когда для завершающего ноля строки места не хватает. Приводит к случайной порче данных, расположенных следом за переполненной строкой. difexacaw пишет: Проверки статического буфера сам компилер выполняет. В большинстве случаев такие проверки выполнить невозможно. Например: Code:
|
|
Создано: 01 апреля 2018 22:28 · Личное сообщение · #7 OKOB пишет: char *gets(char *s); Вы уверены? Я проверил, переполнения нет, по крайне мере не один из регистров не изменился на "616161616161" 4b2c_01.04.2018_EXELAB.rU.tgz - 2018-04-01_22-39-01.png |
|
Создано: 01 апреля 2018 23:09 · Личное сообщение · #8 |
|
Создано: 01 апреля 2018 23:41 · Личное сообщение · #9 OKOB пишет: во-первых, уверены, что переполнили буфер? Точно, массив char s[5], а значений гораздо больше Добавлено спустя 17 минут OKOB пишет: во-вторых, какая связь между переполнением буфера и попаданием этих значений в регистры? Сори за мега глупый вопрос, но как выполнить return адреса который идёт после мусора в буффере? Добавлено спустя 20 минут alex-rudenkiy пишет: Сори за мега глупый вопрос, но как выполнить return адреса который идёт после мусора в буффере? Уже понял, спасибо |
|
Создано: 02 апреля 2018 02:30 · Личное сообщение · #10 alex-rudenkiy > Сори за мега глупый вопрос, но как выполнить return адреса который идёт после мусора в буффере? Исполняемый контекст переписывается в буфере. Есть разные вариации, самый простой - при входе в функцию сохраняется адрес возврата, в той же области памяти, что и уязвимый буфер. Это пространство стека, в котором находятся переменные и атакуемая область. Это классическая ROP атака. Система это блокирует несколькими путями - отслеживает изменение маркеров перед областью с выполняемым контекстом, использует теневой стек для проверки и есчо некоторые методы. ----- vx |
|
Создано: 02 апреля 2018 02:55 · Поправил: dosprog · Личное сообщение · #11 alex-rudenkiy пишет: Вы уверены? Я проверил, переполнения нет, по крайне мере не один из регистров не изменился на "616161616161" Переполнение есть. Программа падает, если введено больше 5 символов. (А их должно быть максимум 4). Code:
Кстати, в WinApi нет таких функций в принципе, об этом подумали в микрософте. Это стандартная си-функция, поэтому ещё переспросил в предыдущем посте: dosprog пишет: winapi'ную?.. |
|
Создано: 02 апреля 2018 17:28 · Личное сообщение · #12 Любая функция которая пишет в память или работает с указателями может быть потенциально опасной, любая функция которая пишет в буфер может быть опасной. Даже функции с валидацией размера буфера может быть опасной, в некоторых случаях и при некоторых оптимизациях компилятор может выкинуть проверку. | Сообщение посчитали полезным: difexacaw |
|
Создано: 03 апреля 2018 01:54 · Личное сообщение · #13 |
|
Создано: 03 апреля 2018 02:16 · Поправил: dosprog · Личное сообщение · #14 |
|
Создано: 03 апреля 2018 07:58 · Личное сообщение · #15 difexacaw пишет: но даже функция с абсолютно корректной валидацией всех параметров может быть уязвимой Сам язык с\с++ с рантаймом не является безопасным, поэтому проблемы могут вылезти где угодно, плата за нулевую стоимость функций, то есть отсутствие избыточных проверок из за которых проседает скорость и увеличивается размер. RC-атаки это отдельный класс и существует даже в относительно безопасных языках. |
|
Создано: 03 апреля 2018 15:10 · Личное сообщение · #16 dosprog Кстати, в WinApi нет таких функций в принципе, об этом подумали в микрософте. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 03 апреля 2018 15:14 · Личное сообщение · #17 |
|
Создано: 03 апреля 2018 15:44 · Личное сообщение · #18 kunix Эти все запрашивают размер буфера. Единственное, как здесь можно переполнить буфер - это если рукожоп не уследит и передаст длину unicode-строки вместо ее размера. | Сообщение посчитали полезным: dosprog |
|
Создано: 04 апреля 2018 00:25 · Личное сообщение · #19 |
|
Создано: 04 апреля 2018 01:20 · Личное сообщение · #20 |
|
Создано: 04 апреля 2018 01:34 · Поправил: dosprog · Личное сообщение · #21 ARCHANGEL пишет: Но вы не признаетесь, что провтыкали АПИ? Да в виндоусе полно всякого напихано, для собственных нужд, многое раньше было вообще недокументировано, пипл даже книги писал на эту тему. В частности, lstrcpy() экспортируется kernel32'ом, а есть одноимённая стандартная си-функция в рантайм-библиотеке msvc, которой и рекомендуют(не-рекомендуют) пользоваться. А так в kernel32.dll есть и [упрощённая] sprintf(), которой микрософтовцы часто пользуются, но пользователям такие вещи делать не рекомендуют. Никогда мне не нравилось выдёргивание служебных api из kernel32, пользовался либо стандартным рантаймом msvc, либо собственными функциями, типа lstrcpy(). [...] |
|
Создано: 04 апреля 2018 10:35 · Личное сообщение · #22 |
|
Создано: 04 апреля 2018 12:41 · Поправил: dosprog · Личное сообщение · #23 )) Кто в состоянии написать sprintf() самостоятельно, тому те рекомендации и не нужны. И потом, можно же импортировать её и из msvcrt.dll А так вообще, самые фэншуйные для микрософта пользователи пишут приложения на VB и на .NET. В принципе, kernel32.dll это системная библиотека и в другой системе, теоретически, её может вообще не оказаться, теоретически. Или она может как-то там не так работать и не то экспортировать. Теоретически. Обо всяких микрософтовских рекомендациях - есть такой Шульман, написал в своё время бестселлер |
|
Создано: 04 апреля 2018 13:03 · Личное сообщение · #24 |
|
Создано: 04 апреля 2018 13:08 · Поправил: dosprog · Личное сообщение · #25 Ну, в очередной Windows205х вполне может такое случиться, когда они решат разом похоронить всё 32-битное. Но тогда, правда, уже и старинные рантайм-библиотеки подсовывать уже не поможет .. впрочем, если подытожить, - то и в msvc всякие вызовы WinAPI линкуются с прямыми вызовами kernel32.dll, так что все эти рассуждения насчёт "не пользоваться kernel32'ом напрямую" явно зыбки и может даже ни о чём.. |
|
Создано: 04 апреля 2018 15:56 · Личное сообщение · #26 |
|
Создано: 05 апреля 2018 03:22 · Поправил: dosprog · Личное сообщение · #27 |
eXeL@B —› Вопросы новичков —› Переполнение только в strcpy? |