битность - в данном случае x86 (для x64 тоже нужно будет, но впоследствии).
суть задачи: есть процесс, у него есть alertable поток. есть метод, позволяющий, избегая VirtualAllocEx и WriteProcessMemory, записать в другой процесс в RW память некоторые данные. почему RW? да потому что RWX вы не найдете в только что загруженном экзешнике по дефолту, а RW дофига (в данном случае используется кусочек выравнивания в конце секции .data в kernelbase.dll).
само собой, мы не можем исполнять тот код, который копируем туда. поэтому идея заключается в генерации цепочки ROP и записи этой цепочки в другой процесс. если кто не знает что такое ROP, поясняю - в коде (например в коде той же ntdll или kernelbase.dll) ищутся небольшие кусочки кода типа (1) "mov eax, 1 / ret", (2) "add ebx, 2 / ret" - ну, наподобие этого. затем формируется стек, в котором лежит адрес инструкции (1), потом адрес инструкции (2). при исполнении ret произойдет прыжок на инструкцию 1, выполнится mov eax, 1, потом произойдет прыжок на инструкцию 2, выполнится add ebx, 2 - снова ret, снова прыжок, ну, суть понятна, можно исполнить какой-то код кусочками.
идея заключается в том, чтобы, после того, как цепочка ROP записана в ту RW память, передать в процессе управление на какой-нибудь ret, при этом в esp подставить адрес этой ROP цепочки. тогда всё получится.
в данном случае речь идет о новой технике Atom Bombing, кто интересуется - может погуглить и почитать. суть в том, что там, для того, чтобы заставить исполняться ROP цепочку, esp устанавливается SetThreadContext'ом (туда тупо пишется адрес этой цепочки), а eip - на какой-нибудь ret в коде.
моя задача: мне кажется решение с SetThreadContext'ом некрасивым (само использование этой функции уже жёсткое палево), я хочу сделать по-другому. идеально было бы так: я делаю QueueUserAPC, первым аргументом передаю адрес ROP-цепочки, а сама APC-функция - это код, найденный в чужом процессе, примерно такой: mov esp, [esp+4] / ret. или xchg esp, [esp + 4] / ret. то есть понимаете? он берет значение для esp из первого аргумента, и вызывает ret (первый адрес с ROP цепочки выталкивается, исполнение началось).
НО! я нихуя не нашёл в коде (искал в kernelbase.dll, ntdll.dll, kernel32.dll) ни mov esp, [esp+4] / ret ни xchg esp, [esp + 4] / ret. также я не нашел что-нибудь тоже подходящее типа pop eax ; pop esp ; ret. да что там - даже два байтика инструкций pop esp ; ret - встречаются только в ЕДИНСТВЕННОМ ЭКЗЕМПЛЯРЕ. и то в Windows 10. а в Windows 7 не встречаются.
задача остаётся прежней: я делаю QueueUserAPC на чужой процесс, могу установить любой адрес. в качестве параметра для APC - адрес ROP-цепочки. мне нужно этот адрес запихнуть в esp и исполнить инструкцию ret. или же может как-то можно обойти иначе, но в голову пока ничего не пришло.
#task #intercept #asm #windows #rop
Думаю, не встречаются из-за того, что перед ret ещё может стоять какой-нибудь leave или вроде того
а для чего это нужно? Современные системы безопасности наверняка уже это учитывают
а вдруг кто-то так уже делал?
> битность - в данном случае x86 (для x64 тоже ... это какие такие битности "x86" и "x64" ?
Обсуждают сегодня