eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: (+1 невидимый пользователь)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Вопросы новичков —› Переполнение только в strcpy?
Посл.ответ Сообщение

Ранг: 3.3 (гость)
Статус: Участник

Создано: 31 марта 2018 13:55 New!
Цитата · Личное сообщение · #1

Здравствуйте, скажите пожалуйста, такой вопрос, вот я смотрю такую тему как "Переполнение буфера" и в 99.9% случаев приводят winapi'ную подпрограмму strcpy и вот хочу спросить, больше не существует мест уязвимых под переполнение буфера, а если есть то какие наиболее известные подходы их нахождения?


Ранг: 515.2 (!)
Статус: Участник
Победитель турнира 2010

Создано: 31 марта 2018 18:42 New!
Цитата · Личное сообщение · #2

ssize_t read(int fd, void *buf, size_t count); при count > sizebuf
char *gets(char *s);
char *fgets(char *s, int size, FILE *stream);
int sprintf(char *str, const char *format, ...);

Ранг: 49.2 (посетитель)
Статус: Участник

Создано: 31 марта 2018 19:04 New!
Цитата · Личное сообщение · #3

В Android была ржака.
Целочисленное переполнение в new.
Если буфера мало, его что угодно переполнит.


Ранг: 122.7 (ветеран)
Статус: Участник
Qt Developer

Создано: 31 марта 2018 19:14 · Поправил: hors New!
Цитата · Личное сообщение · #4

alex-rudenkiy пишет:
Здравствуйте, скажите пожалуйста, такой вопрос, вот я смотрю такую тему как "Переполнение буфера" и в 99.9% случаев приводят winapi'ную подпрограмму strcpy и вот хочу спросить, больше не существует мест уязвимых под переполнение буфера, а если есть то какие наиболее известные подходы их нахождения?


Любая функция которая работает с буфером теоретически может быть причиной переполнения если буфер неправильно выделен.

| Сообщение посчитали полезным: sefkrd



Ранг: 265.0 (наставник)
Статус: Участник

Создано: 31 марта 2018 21:57 New!
Цитата · Личное сообщение · #5

alex-rudenkiy

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

Добавлено спустя 17 минут
> есть то какие наиболее известные подходы их нахождения?

Этим вопросом не только вы интересуетесь

Это называется OP-атаками. Обьектом таких атак являются алгоритмические ошибки. Проверки статического буфера сам компилер выполняет. Ошибки в алгоритмах находятся только по крэшам или человеческим анализом кода. Инструмента нет, это очень сложная и не решённая задача.

Ранг: 382.5 (мудрец)
Статус: Участник

Создано: 1 апреля 2018 01:55 · Поправил: dosprog New!
Цитата · Личное сообщение · #6

alex-rudenkiy пишет:
приводят winapi'ную подпрограмму strcpy

winapi'ную?..

alex-rudenkiy пишет:
больше не существует мест уязвимых под переполнение буфера, а если есть то какие наиболее известные подходы их нахождения?

Стресс-тестирование.
А наиболее частая и неприятная ошибка - это т.н. "+/-1", когда для завершающего ноля строки места не хватает.
Приводит к случайной порче данных, расположенных следом за переполненной строкой.

difexacaw пишет:
Проверки статического буфера сам компилер выполняет.

В большинстве случаев такие проверки выполнить невозможно.
Например:
Code:
  1. {
  2. char s1[20],*ps1=&s1[0];
  3. while(1) {*ps1=' ';ps1++;}
  4. }



Ранг: 3.3 (гость)
Статус: Участник

Создано: 1 апреля 2018 22:28 New!
Цитата · Личное сообщение · #7

OKOB пишет:
char *gets(char *s);

Вы уверены?
Я проверил, переполнения нет, по крайне мере не один из регистров не изменился на "616161616161"

{ Атач доступен только для участников форума } - 2018-04-01_22-39-01.png


Ранг: 515.2 (!)
Статус: Участник
Победитель турнира 2010

Создано: 1 апреля 2018 23:09 New!
Цитата · Личное сообщение · #8

alex-rudenkiy пишет:
не один из регистров не изменился на "616161616161"

во-первых, уверены, что переполнили буфер?
во-вторых, какая связь между переполнением буфера и попаданием этих значений в регистры?

Ранг: 3.3 (гость)
Статус: Участник

Создано: 1 апреля 2018 23:41 New!
Цитата · Личное сообщение · #9

OKOB пишет:
во-первых, уверены, что переполнили буфер?

Точно, массив char s[5], а значений гораздо больше

Добавлено спустя 17 минут
OKOB пишет:
во-вторых, какая связь между переполнением буфера и попаданием этих значений в регистры?

Сори за мега глупый вопрос, но как выполнить return адреса который идёт после мусора в буффере?

Добавлено спустя 20 минут
alex-rudenkiy пишет:
Сори за мега глупый вопрос, но как выполнить return адреса который идёт после мусора в буффере?

Уже понял, спасибо


Ранг: 265.0 (наставник)
Статус: Участник

Создано: 2 апреля 2018 02:30 New!
Цитата · Личное сообщение · #10

alex-rudenkiy

> Сори за мега глупый вопрос, но как выполнить return адреса который идёт после мусора в буффере?


Исполняемый контекст переписывается в буфере. Есть разные вариации, самый простой - при входе в функцию сохраняется адрес возврата, в той же области памяти, что и уязвимый буфер. Это пространство стека, в котором находятся переменные и атакуемая область. Это классическая ROP атака. Система это блокирует несколькими путями - отслеживает изменение маркеров перед областью с выполняемым контекстом, использует теневой стек для проверки и есчо некоторые методы.

Ранг: 382.5 (мудрец)
Статус: Участник

Создано: 2 апреля 2018 02:55 · Поправил: dosprog New!
Цитата · Личное сообщение · #11

alex-rudenkiy пишет:
Вы уверены?
Я проверил, переполнения нет, по крайне мере не один из регистров не изменился на "616161616161"

Переполнение есть. Программа падает, если введено больше 5 символов. (А их должно быть максимум 4).
Code:
  1. void main(void){char s[5],*ps; ps=gets(&s[0]); printf("\n%s\n",ps);}
{ Атач доступен только для участников форума } - gets4.exe

Кстати, в WinApi нет таких функций в принципе, об этом подумали в микрософте.
Это стандартная си-функция, поэтому ещё переспросил в предыдущем посте:

dosprog пишет:
winapi'ную?..




Ранг: 0.0 (гость)
Статус: Участник

Создано: 2 апреля 2018 17:28 New!
Цитата · Личное сообщение · #12

Любая функция которая пишет в память или работает с указателями может быть потенциально опасной, любая функция которая пишет в буфер может быть опасной. Даже функции с валидацией размера буфера может быть опасной, в некоторых случаях и при некоторых оптимизациях компилятор может выкинуть проверку.

| Сообщение посчитали полезным: difexacaw



Ранг: 265.0 (наставник)
Статус: Участник

Создано: 3 апреля 2018 01:54 New!
Цитата · Личное сообщение · #13

shellstorm

Верно, но даже функция с абсолютно корректной валидацией всех параметров может быть уязвимой, при асинхронном использовании входных параметров(RC-атаки). Для этого нужен второй поток, это локально не важно, но имеет значение в целом.

Ранг: 382.5 (мудрец)
Статус: Участник

Создано: 3 апреля 2018 02:16 · Поправил: dosprog New!
Цитата · Личное сообщение · #14

В любом случае, найти такие ошибки можно [практически] только тестированием.
Кстати, нормальные тестировщики это не прыщавые девочки-подростки с зарплатой 350 уёв,
а пожилые прошаренные дядьки с зарплатой на порядок большей.
Но их мало.

Ранг: 0.0 (гость)
Статус: Участник

Создано: 3 апреля 2018 07:58 New!
Цитата · Личное сообщение · #15

difexacaw пишет: но даже функция с абсолютно корректной валидацией всех параметров может быть уязвимой

Сам язык с\с++ с рантаймом не является безопасным, поэтому проблемы могут вылезти где угодно, плата за нулевую стоимость функций, то есть отсутствие избыточных проверок из за которых проседает скорость и увеличивается размер. RC-атаки это отдельный класс и существует даже в относительно безопасных языках.


Ранг: 645.9 (!)
Статус: Участник
ALIEN Hack Team

Создано: 3 апреля 2018 15:10 New!
Цитата · Личное сообщение · #16

dosprog

Кстати, в WinApi нет таких функций в принципе, об этом подумали в микрософте.

--> А они есть<--

Ранг: 49.2 (посетитель)
Статус: Участник

Создано: 3 апреля 2018 15:14 New!
Цитата · Личное сообщение · #17

dosprog пишет:
Кстати, в WinApi нет таких функций в принципе, об этом подумали в микрософте.
Это стандартная си-функция, поэтому ещё переспросил в предыдущем посте:

Ну как-бы любая API функция, которая возвращает данные переменной длинны, сотни их.
GetModuleFileName, RegQueryValue, ...

Ранг: 117.2 (ветеран)
Статус: Участник

Создано: 3 апреля 2018 15:44 New!
Цитата · Личное сообщение · #18

kunix
Эти все запрашивают размер буфера. Единственное, как здесь можно переполнить буфер - это если рукожоп не уследит и передаст длину unicode-строки вместо ее размера.

| Сообщение посчитали полезным: dosprog


Ранг: 382.5 (мудрец)
Статус: Участник

Создано: 4 апреля 2018 00:25 New!
Цитата · Личное сообщение · #19

ARCHANGEL пишет:
--> А они есть<--


Типа да

Warning Do not use. Consider using StringCchCopy instead. See Remarks.



Ранг: 645.9 (!)
Статус: Участник
ALIEN Hack Team

Создано: 4 апреля 2018 01:20 New!
Цитата · Личное сообщение · #20

dosprog

Ну так и в линуксах не говорят: "юзайте их почаще". Но вы не признаетесь, что провтыкали АПИ?

Ранг: 382.5 (мудрец)
Статус: Участник

Создано: 4 апреля 2018 01:34 · Поправил: dosprog New!
Цитата · Личное сообщение · #21

ARCHANGEL пишет:
Но вы не признаетесь, что провтыкали АПИ?

Да в виндоусе полно всякого напихано, для собственных нужд,
многое раньше было вообще недокументировано, пипл даже книги писал на эту тему.

В частности, lstrcpy() экспортируется kernel32'ом, а есть одноимённая стандартная си-функция в рантайм-библиотеке msvc, которой и рекомендуют(не-рекомендуют) пользоваться.

А так в kernel32.dll есть и [упрощённая] sprintf(), которой микрософтовцы часто пользуются,
но пользователям такие вещи делать не рекомендуют.

Никогда мне не нравилось выдёргивание служебных api из kernel32,
пользовался либо стандартным рантаймом msvc, либо собственными функциями, типа lstrcpy().
[...]



Ранг: 281.6 (наставник)
Статус: Участник

Создано: 4 апреля 2018 10:35 New!
Цитата · Личное сообщение · #22

dosprog пишет:
но пользователям такие вещи делать не рекомендуют

Интересно, почему? Вот не используем RTC по некоторым причинам, а sprintf() необходима, что тогда делать? Самому писать? Они это рекомендуют? )

Ранг: 382.5 (мудрец)
Статус: Участник

Создано: 4 апреля 2018 12:41 · Поправил: dosprog New!
Цитата · Личное сообщение · #23

)) Кто в состоянии написать sprintf() самостоятельно, тому те рекомендации и не нужны.
И потом, можно же импортировать её и из msvcrt.dll
А так вообще, самые фэншуйные для микрософта пользователи пишут приложения на VB и на .NET.

В принципе, kernel32.dll это системная библиотека и в другой системе, теоретически, её может вообще не оказаться, теоретически. Или она может как-то там не так работать и не то экспортировать. Теоретически.

Обо всяких микрософтовских рекомендациях -
есть такой Шульман, написал в своё время бестселлер "Неофициальная Windows 95", так он рекомендует считать, что в микрософте руководствуются поговоркой "dont listen what we talk, see what we do."


Ранг: 281.6 (наставник)
Статус: Участник

Создано: 4 апреля 2018 13:03 New!
Цитата · Личное сообщение · #24

dosprog пишет:
теоретически, её может вообще не оказаться

Кто-нибудь уже наблюдал такое чудо? )

Ранг: 382.5 (мудрец)
Статус: Участник

Создано: 4 апреля 2018 13:08 · Поправил: dosprog New!
Цитата · Личное сообщение · #25

Ну, в очередной Windows205х вполне может такое случиться, когда они решат разом похоронить всё 32-битное.
Но тогда, правда, уже и старинные рантайм-библиотеки подсовывать уже не поможет


.. впрочем, если подытожить, - то и в msvc всякие вызовы WinAPI линкуются с прямыми вызовами kernel32.dll,
так что все эти рассуждения насчёт "не пользоваться kernel32'ом напрямую" явно зыбки
и может даже ни о чём..

Ранг: 117.2 (ветеран)
Статус: Участник

Создано: 4 апреля 2018 15:56 New!
Цитата · Личное сообщение · #26

Ядерная sprintf() не поддерживает float, double и, возможно, некоторые расширенные параметры форматирования. Но если от нее нужно только %s, %ls, %d, %u, %x, то вполне можно пользоваться.

Ранг: 382.5 (мудрец)
Статус: Участник

Создано: 5 апреля 2018 03:22 · Поправил: dosprog New!
Цитата · Личное сообщение · #27

rmn пишет:
Ядерная sprintf() не поддерживает float, double и, возможно, некоторые расширенные параметры форматирования.


Не возможно, а точно не поддерживает.
Её возможностей хватает, чтобы выводить системную информацию в целых числах и строках,
а всякие изыски вроде "%*.*f" она не воспринимает.


 eXeL@B —› Вопросы новичков —› Переполнение только в strcpy?

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS