CASINOJOY - Ставка На Успех! Проверь Свою Удачу!


Нажмите CTRL-D чтобы добавить нас в закладки
HackZone.RU - Параллельные ветви защиты динамической памяти в Windows
Войти / Регистрация / Участники
Определение даты выпуска iPhone по серийному номеру
-
Поиск по сайту
Форумы



Реклама

Поиск ТОП Добавить публикацию

Параллельные ветви защиты динамической памяти в Windows

08.09.2009

Хронология

В Windows, основанном на динамической памяти, буферное переполнение может быть получено двумя способами. Первый способ рассматривает переполнение для Windows 2000, Windows XP и Windows XP SP1. Код управления динамической памятью для этих систем, расположен в ntdll.dll, не выполняет какой-либо «санитарной» проверки на участках динамической памяти. Когда переполнение происходит, следующий смежный участок памяти может быть записан сверху, и, если хорошие значения изменены, последующая операции с динамической памятью (которая распределена, свободна… ) может привести к произвольному четырех - байтовому наложению записей в памяти. Недавно появились новые методики, но принцип остается тем же самым: перезапись определенной части памяти с определенными значениями, чтобы получить контроль и выполнить нужное действие позднее.

Вторая категория включает Windows XP, операционные системы Windows 2003 и Windows XP SP2. Microsoft изменил структуры динамической памяти и функции манипуляции динамической памятью; она начинает работу с участков памяти, которые были добавлены. Первая проверка должна проверить целостность Cookie-файла безопасности в заголовке участка памяти, гарантировать, что никакое переполнение не произошло, когда этот тот же самый участок памяти распределен. Вторая проверка, наиболее эффективная, проверяет начальные указатели и указатели связи с предыдущим элементом свободно изменяемого участка памяти, при любом действии (распределение, соединение). Та же самая проверка выполнена для фактически изменяемых блоков.

Еще были введены другие виды защиты, главным образом рандомизация PEB, и кодирование указателей исключения. Эти виды защиты должны уменьшить количество установленных и известных указателей функции, используемых глобально процессом. Эти изменения были целями установления привилегий, чтобы эксплуатировать старый путь при переполнении динамической памяти. Первая общая работа, детализирующая метод, чтобы обойти новые защиты динамической памяти, была опубликована в начале года 2005 Александром Анисимовым. Она состоит из эксплуатации функции inexistent, проверяющей сохраненный список. Первые d слов сохраняются на входе – это начало простого связанного списка участков памяти, отмечаемых как занятые, но готовые к распределению. Когда распределение происходит, первый блок списка хранения соответствия может быть возвращен: Это просто удалено из списка, заменяя передовой указатель ссылки (FLink) в сохраняющем входе указателем FLink недавно распределенного блока.  Данный процесс разъясняется на рисунке 1.

 

Эта новая методика хороша в теории, но кажется зависимой от аппаратной части на практике. Следующие операции динамической памяти должны произойти, подделывая хорошие входные значения, если мы хотим, чтобы наложение записей N-byte случилось:

1 - Распределение блока размера N (<0x3F8 байтов)

2 - Освобождение от этого блока: на блок ссылаются при просмотре побочной таблицы

3 - Переполнение происходит в предыдущем  смежном блоке: мы можем управлять указателем Flink ранее освобожденного блока

4 - Блок размера Nразмещен: наш поддельный указатель написан в просмотре побочной таблицы

5 - Размещен второй блок размера N: наш поддельный указатель возвращен

6 – Копирование операции контроля ввода из буфера: эти байты записаны в выбранное нами местоположение

 

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

 

 

Рис. 1: Размещение блока(участка памяти - Chunk) A для просмотра побочной таблицы

 

Новый способ обойти защиты динамической памяти

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

 

Динамическая память принимает значения по умолчанию процесса, так же как другие созданные системой процессы с динамической памятью, используется многими API, чтобы хранить информацию относительно процесса и его среды. Когда DLL загружен, его основная функция выполняется (DllMain, или подобная) и часто, данные могут храниться на динамической памяти процесса. А что, если эти части данных перезаписаны?

Давайте брать основную программу, такую как записная книжка Windows. Мы можем обратить внимание, что даже эта программа нуждается в большом количестве динамических библиотек, чтобы работать. Если мы исследуем заданную по умолчанию динамическую память, прежде, чем основной поток запустит выполняться, то мы обратим внимание, что изрядное количество участков динамической памяти было распределено этими DLLs. Многие из этих участков памяти имеют длину 40 байтов (включая 8 байтов для заголовка) и вписаны в структуру на рисунке 2:

 

 
Chunk header
0 X
A B
0 0
? ?

 

Рис. 2: 40-байтовый длинны участок динамической памяти, найденный в динамической памяти значения по умолчанию процесса

 

A: Адрес следующей “40-байтовой длины структуры”

B: Адрес предыдущей “40- байтовой длины структуры”

 

Из этого следует, что структура, указанная X, является фактически критическим разделом. То, когда критический раздел будет инициализирован, связанный “40-байтовой длины структурой” - мы назовем его связавшейся структурой, также создано, чтобы следить за критическим разделом. Несколько из этих структур расположены в разделе данных ntdll.dll; когда все они используются, связавшиеся структуры созданы в заданной по умолчанию динамической памяти. Рисунок 3 показывает отношению между компоновкой структур и критическими разделами.

Этот двойной связанный список напоминает нам способ, при котором свободные участки памяти обработаны подпрограммами управления динамической памятью. Во время разрушения критического раздела связанная структура компоновки будет удалена из ее списка. Если мы заменяем A и B, мы должны тогда быть в состоянии записать поверх 4-х байтовую часть памяти:

 

Из RtlDeleteCriticalSection (ntdll.dll version 5.1.2600.2180):

mov [eax], ecx ; eax=B

mov [ecx+4], eax ; ecx=A

 

 

Рис. 3: Критические разделы и компоновка структур

 

Методика работает потому что:

- Никакие «санитарные» проверки не выполнены на их частные конечные и начальные указатели.

- Критические разделы разрушаются во время завершения процесса; это гарантирует, что перезапись произойдет.

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

 

Вы найдете Концепт код, демонстрирующий методику в Приложении 1.

 

Заключение

Представленная выше методика использовалась, для того чтобы успешно эксплуатировать неисправленное переполнение динамической памяти, расположенное в стандартной утилите Windows из WindowsXPSP2.

Однако несколько проблем остаются только частично решенными: Хотя у нас есть возможность записать поверх, по крайней мере, 4 байта памяти, мы должны выбрать хорошие значения для конечных и начальных указателей. Классическое использование указателей по обработке особых ситуаций ставит под угрозу, так же как глобальные указатели функции, расположенные в PEB.

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

 

Приложение 1: Концепт код

//---------------------------------------------------------------------
// This code demonstrates how an overflow in critical section related
// structures stored in heap chunks can be used to produce an
// arbitrary memory overwrite
// (c) 2005 Nicolas Falliere
// [email protected]
//---------------------------------------------------------------------
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
VOID GetChunkList(DWORD *pChunks, INT *nbChunks)
{
DWORD pid;
HANDLE snapshot;
HEAPLIST32 list;
HEAPENTRY32 entry;
BOOLEAN bNext;
INT cnt = 0;
pid = GetCurrentProcessId();
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST, pid);
if(snapshot == INVALID_HANDLE_VALUE)
{
printf("[Error] Cannot take a heap snapshot\n");
}
else
{
ZeroMemory(&list, sizeof(list));
list.dwSize = sizeof(HEAPLIST32);
bNext = Heap32ListFirst(snapshot, &list);
while(bNext)
{
ZeroMemory(&entry, sizeof(entry));
entry.dwSize = sizeof(HEAPENTRY32);
bNext = Heap32First(&entry, list.th32ProcessID,
list.th32HeapID);
while(bNext)
{
pChunks[cnt] = entry.dwAddress;
cnt++;
ZeroMemory(&entry, sizeof(entry));
entry.dwSize = sizeof(HEAPENTRY32);
bNext = Heap32Next(&entry);
}
ZeroMemory(&list, sizeof(list));
list.dwSize = sizeof(HEAPLIST32);
bNext = Heap32ListNext(snapshot, &list);
}
CloseHandle(snapshot);
6
*nbChunks = cnt;
}
}
int main(void)
{
HANDLE hHeap;
DWORD pChunks[500];
INT nbChunks;
INT i;
HMODULE hLib;
DWORD *p;
hHeap = GetProcessHeap();
printf("Default heap: %X\n", hHeap);
hLib = LoadLibrary("oleaut32.dll");
printf("LoadLibrary : oleaut32.dll\n");
GetChunkList(pChunks, &nbChunks);
for(i = 0; i < nbChunks; i++)
{
// Chunk size is 40 bytes
if(*(WORD *)(pChunks[i] - 8) == 5)
{
p = (DWORD *)(pChunks[i]);
// Check if FLink and BLink are there
if(p[2] && p[3])
{
printf("Structure found at address: %8X\n", p);
printf("Before modification : A=%8X B=%8X\n", p[2], p[3]);
memcpy(p + 2, "AAAABBBB", 8);
printf("After modification : A=%8X B=%8X\n", p[2], p[3]);
break;
}
}
}
printf("Press Enter to terminate the program and trigger the access
violation\n");
getchar();
return 0;
}

При копировании материалов ссылка на HackZone.RU обязательна

Добавить страницу в закладки

 Детали
Категория: Взлом
Опубликовал: DiMan
Просмотров: 6497
Проголосовало через SMS: 0
Ключевые слова: взлом windows xp, (найти похожие документы)
  Разместить у себя на сайте
Прямая ссылка
HTML
BBCode ссылка
BBCode ссылка с текстом

 Комментарии (оставить свой комментарий можно здесь)
Только зарегистрированные пользователи могут оставлять комментарии

Зарегистрироваться *** Авторизоваться


 Последние новости и статьи  Последние сообщения с форумов
  • WhatsApp уверяет пользователей, что Facebook не имеет доступа к и...
  • Однострочная команда в Windows 10 может повредить жесткий диск с ...
  • Кардерский форум Joker’s Stash объявил о закрытии
  • Релиз ядра Linux 5.9
  • Российские хакеры вооружились уязвимостью Zerologon
  • Тысячи приватных звонков американских заключенных оказались в отк...
  • Шифровальщик атаковал немецкую компанию Software AG
  • Злоумышленники используют службу Windows Error Reporting для бесф...
  • Microsoft предупредила о вымогателях, которые выдают себя за МВД ...
  • Инфостилер Valak ворует информацию из почтовых систем Microsoft E...

    Все новости... Все статьи... Прислать новость RSS
  • Разное / Предложения работы » Сервис Postman - 500 руб за получение писем и 10€ за пересыл...
  • Разное / Куплю, приму в дар » Покупка аккаунтов Uphold
  • Разное / Предложения работы » Re: Нужен Взлом сайта на DLE
  • Разное / Предложения работы » Re: Нужен Взлом сайта на DLE
  • Разное / Предложения работы » Re: Нужен Взлом сайта на DLE
  • Разное / Предложения работы » Re: Нужен Взлом сайта на DLE
  • Взлом и безопасность / Новичкам » Re: Помогите взломать gmail.com
  • Разное / Предложения работы » Re: Зайти на сайт из под Администратора + публикация статьи
  • Взлом и безопасность / WEB сайтов » Брутс для 2fa биржи
  • Разное / Предложения работы » Нужен Взлом сайта на DLE

    Все форумы... RSS


  • Разместить рекламу
    © HackZone Ltd. 1996-2020. Все права зарегистрированы.
    Перепечатка материалов без согласования и указания источника будет преследоваться по Закону

    О проекте | История проекта | Размещение рекламы | Обратная связь | Правила поведения на портале
    contador de visitas счетчик посещений

    #{title}

    #{text}

    x

    #{title}

    #{text}