169 похожих чатов

Система: Windows (от XP до 10, решение должно быть универсальным),

битность - в данном случае 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. или же может как-то можно обойти иначе, но в голову пока ничего не пришло.

5 ответов

4 просмотра

#task #intercept #asm #windows #rop

Думаю, не встречаются из-за того, что перед ret ещё может стоять какой-нибудь leave или вроде того

а для чего это нужно? Современные системы безопасности наверняка уже это учитывают

а вдруг кто-то так уже делал?

> битность - в данном случае x86 (для x64 тоже ... это какие такие битности "x86" и "x64" ?

Похожие вопросы

Обсуждают сегодня

Такой вопросец - есть функция function MySuperDuperConcat(const a: array of AnsiString): AnsiString; Как мне в её теле сделать вот так? Result:=Concat(a); А не грустный вариан...
notme
15
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
48
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
А чем вам питонисты не угодили?😂
.
79
Вот смотрите у меня есть два стрима сейчас fs, cs: TStream; fs := TFileStream.Create('filename'); cs := TCompressionStream.Create(compression_level, fs); Я хочу сделать так: ...
notme
5
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
83
Можно ли загрузить скрипт py в бота чтобы он работал по нему? как это сделать?
huskadam #RCC Фанат? @hitlerpvp
13
Всем здравствуйте! Я хотел узнать сколько стоит средняя месячная зарплата у Electron js разработчиков? Мне очень это важно и нужно, плиз помогите узнать эту инфу! Для Джунио...
U.K.
10
Hello. Could you please help me with finding all coordinates within a radius using a spatial index, given that I have a table with coordinates? SET @lng = 37.57925; SET @lat ...
Rinchin G
8
free(NULL) это UB?
#
8
Карта сайта