Я никогда не писал на асме, но недавно попалась книженция Тома Свана по асму и понеслось...
Итак:
Например, загоню в стек слово-опкод 90С3h, то есть просто ret, nop.
И мне хочется выполнить этот ret.
Как всем известно, ret берет свой адрес тоже из стека.
Что-нибудь вроде:
push token
push 90C3h
;...
;Какие-то манипуляци со стеком, чтобы ret правильное значение брал
;...
jmp esp
token:
метка нужна для ret'а, такая замена call'а.
Вообщем, на этом мысль останавливается. Кто-нибудь, скажите что-нибудь по этом поводу. Нужно просто передать управление в область стека, в которой выполниться ret и вернет управление программе.
Цель — отравить жизнь себе и недобросовестному пользователью.
Когда-то на сайте www.programme.ru была статья, кажется, самого Криса Касперски про выполнение кода на стеке. Всё было так детальненько и подробненько описано. Но потом она куда-то делась. Увы.
Здравствуйте, Evengar, Вы писали:
E>Вообщем, на этом мысль останавливается. Кто-нибудь, скажите что-нибудь по этом поводу. Нужно просто передать управление в область стека, в которой выполниться ret и вернет управление программе.
Код, вообще говоря, нельзя выполнять на стековых страничках (rw). Но на кривых микропроцессорах (i386 и клоны) это возможно, потому что Intel не различает атрибут read и execute.
Здравствуйте, Murr, Вы писали:
M>Код, вообще говоря, нельзя выполнять на стековых страничках (rw). Но на кривых микропроцессорах (i386 и клоны) это возможно, потому что Intel не различает атрибут read и execute.
Странички не различает, сегменты различает. Вроде так. Правда, эти сегменты, по-моему, никто полноценно не использует — ограничиваются страничками.
Ответный вотрос. Вы пишете на Асме в чистую или используете:
__asm {
...
}
ели последнее в VisualStudio, то это полная лажа, потому что написанное в последнем не как не совпадает с действительностью, т.к. я писал:
__asm {
...
push ah
...
push al
...
}
Здравствуйте, Evengar, Вы писали:
E>Вообщем, на этом мысль останавливается. Кто-нибудь, скажите что-нибудь по этом поводу. Нужно просто передать управление в область стека, в которой выполниться ret и вернет управление программе.
Здравствуйте, Denisuk, Вы писали:
D>Здравствуйте, Evengar.
D>Ответный вотрос. Вы пишете на Асме в чистую или используете:
__asm {
...
push ah
...
push al // Это как? Разве так можно? Я думал, можно только 16- или 32-битные значения в стек пихать )в зависимости от режима)
...
}
Re[3]: Можно ли выполнить код из стека?
От:
Аноним
Дата:
07.08.03 07:02
Оценка:
Здравствуйте, WFrag, Вы писали:
WF>Здравствуйте, Denisuk, Вы писали:
D>>Здравствуйте, Evengar.
D>>Ответный вотрос. Вы пишете на Асме в чистую или используете:
WF>__asm { WF> ... WF> push ah WF> ... WF> push al // Это как? Разве так можно? Я думал, можно только 16- или 32-битные значения в стек пихать )в зависимости от режима) WF> ... WF>}
Пихать можно и 16, и 32 бита в любом режиме. Но вот "push ah" весьма странная операция, я даже задумался с какой "действительностью" не совпадает код внутри __asm.
Здравствуйте, Аноним, Вы писали:
WF>>__asm { WF>> ... WF>> push ah WF>> ... WF>> push al // Это как? Разве так можно? Я думал, можно только 16- или 32-битные значения в стек пихать )в зависимости от режима) WF>> ... WF>>}
А>Пихать можно и 16, и 32 бита в любом режиме. Но вот "push ah" весьма странная операция, я даже задумался с какой "действительностью" не совпадает код внутри __asm.
push ah, push al — это недокументированные команды процессора 8086 Потом эти команды исчезли.
В стек помещалосб в любом случае слово, а не байт.