RelocAlloc: Использование секции .reloc для замены типичных вызовов выделения памяти
Объяснение кода:
- Сначала мы находим адреса всех DLL, отображённых в нашем процессе.
- Затем мы создаём массив структур и заполняем его данными — это функция Initialize().
- Теперь, когда у нас есть заполненный массив, следующий шаг — поиск нужного адреса.
- Вызов GetSuitableAddress(SIZE_T ShellcodeSize) выполнит эту задачу; то есть найдёт нам подходящую code cave (пустое место в памяти, подходящее по размеру для шелл-кода).
- Если она найдена, она будет возвращена.
- Чтобы использовать её, мы должны изменить защиту памяти на записываемую/исполняемую... (в PoC она сразу rwx)
Демонстрация:
img1
img2
Примечание: это работает только с небольшими шелл-кодами, так как зависит от отображённых DLL — чем больше секция .reloc, тем выше шансы получить валидный адрес. Кроме того, это протестировано только на машине x64, но должно работать и для x86 (я так думаю :p)
# СЛЕДИТЕ ЗА ОБНОВЛЕНИЯМИ
120064592-a5c83480-c075-11eb-89c1-78732ecaf8d3