Уязвимости программного обеспечения 4-й недели

На этой неделе мы рассмотрели «атакующую» сторону информационной безопасности. Мы изучили уязвимость javascript в Internet Explorer в Windows 7. Описанные здесь атаки невозможны в более новых операционных системах, поскольку они были исправлены, чтобы люди не могли злоупотреблять стеком. Однако многие устаревшие системы по-прежнему используют Windows 7 или более раннюю версию и по-прежнему уязвимы для этих атак. В этой статье будут рассмотрены основные темы и шаги, предпринятые для использования таких инструментов, как WinDbg (используется здесь) и аналогичных инструментов отладки.

После загрузки WinDbg и присоединения вкладки IE FSExploitMe к нашему процессу мы можем установить точку останова и запустить команду «r», чтобы отобразить все регистры. Здесь мы видим eax-edx, esi, edi, eip, esp, ebp и соответствующие флаги. После присоединения WinDbg распечатывает все модули, связанные с вкладкой IE, и мы видим, что адрес, по которому загружается FSExploitMe.ocx, равен 54430000 5443b000.

Если мы хотим посмотреть на размер стека, нам нужно использовать команду «!teb», чтобы посмотреть базу стека и предел стека. Мы можем вычесть предел стека из основания стека, чтобы получить размер стека, который в данном случае равен 00004000.

Команда процесса ‘!peb’ может показать нам начальный адрес кучи процесса.

Мы можем найти значение EIP в нашей точке останова или после использования команды «r», чтобы вывести список всех регистров, как мы это делали раньше.

Чтобы узнать, сколько места выделено для локальных переменных в стеке, мы можем использовать «u eip L10» для отображения следующих 10 шагов процесса. Мы видим, что данные перемещаются в ECX и выделяются 14 часов или 20 бит из ESP. Затем, после выполнения 5 инструкций с «t 5», мы можем использовать команду du poi (esp) для преобразования Unicode ASCII в строку «FluffyBunniesDontFlapOrQuack».

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

После того, как мы освободим выделенное пространство, мы можем удалить кучу страниц. Чтобы вставить наш шелл-код, нам нужно знать, сколько памяти потребуется. Мы можем сделать это, запрашивая определенный размер в памяти через равные промежутки времени в блоке данных с помощью программы динамического распыления на Javascript. Используя VMMap, мы можем увидеть, как распределяется память. Это происходит по шаблону, в котором мы можем ясно видеть в памяти, где мы можем начать и закончить с легко читаемых адресов памяти. Как только шелл-код вставлен в выделенное нам пространство, мы снова вызываем объект для завершения.