Привет всем. Встала задача обойти DEP. Задача: заставить выполнить приложение-жертву CreateProcess... Имеем: может запустить свою программу (генерирующую щел) на том компе. Эта программа может записывать байты по заданным адресам, а так же запускать код по нужному адресу. Не доступны функции, которые идут через OpenProcess (Vitrual*** и тд). Если бы не ДЕП - то записываем данные в любое свободное место с READ_WRITE аттрибутом и запускаем код. Но вот ДЕП не дает коду выполниться. (ОС - 7, виста) Какая идея: ищем в стандартных библиотеках участок кода, подожий на MOV EAX,DWORD PTR DS:[755737D4] PUSH [755737D8] CALL DWORD PTR DS:[EAX] В чем идея: адреса нужно найти такие, чтобы эта мапять (755737D4, 755737D8) была READ_WRITE . Меняем число по адресу :[755737D4] таким образом, чтобы CALL DWORD PTR DS:[EAX] попадал например на Sleep. А по адресу [755737D8] - пишем время, на которое нужно уснуть. Смысл ясен? Более сложные операции можно сделать из нескольких таких подобранных кусков. Но беглое изучение кода кроме этого подходящих кусков не дало... Может и велосипед изобретаю и давно этот фокус уже придуман?
Придуман Solar Designer-ом где-то в конце 90-х, называется ret2libc, или ROP -- в современной инкарнации техники. ROP-программа представляет собой последовательность адресов на стеке, которые указывают на последовательно исполняемые ROP-гаджеты. Задачей таких гаджетов, обычно, является вызов VirtualProtect(MEM_EXECUTE_READWRITE) для стека, что бы можно было сделать jmp esp на "обычный" шеллкод (хотя бывают варианты с выделенеием новой исполняемой страницы и копированием туда шеллкода). Неплохой туториал по ROP: http://www.corelan.be/index.php/201...t-10-chaining-dep-with-rop-the-rubikstm-cube/ Мой pykd скрипт для поиска ROP-гаджетов в WinDbg: http://www.everfall.com/paste/id.php?nlxq5erg07ho
Разобрался. Суть в том что я как бы могу записать в стек числа, которые будут использованы для гаджетов, и потом через ret возвращаться обратно в мою цепочку. Вопрос в другом: я не знаю адрес стека в чужом приложении. Я могу записать данные в произвольный участок памяти. Как мне записать адреса гаджетов в стек, да еще и так, чтобы на адрес первого гаджета попал ret ? Ну то есть можно ли в качестве стека юзать участок памяти READ_WRITE?