Можно ли выполнить код из стека?
От: Evengar  
Дата: 06.08.03 13:42
Оценка:
Я никогда не писал на асме, но недавно попалась книженция Тома Свана по асму и понеслось...

Итак:
Например, загоню в стек слово-опкод 90С3h, то есть просто ret, nop.
И мне хочется выполнить этот ret.

Как всем известно, ret берет свой адрес тоже из стека.

Что-нибудь вроде:


push token
push 90C3h
;...
;Какие-то манипуляци со стеком, чтобы ret правильное значение брал
;...
jmp esp
token:

метка нужна для ret'а, такая замена call'а.

Вообщем, на этом мысль останавливается. Кто-нибудь, скажите что-нибудь по этом поводу. Нужно просто передать управление в область стека, в которой выполниться ret и вернет управление программе.

Цель — отравить жизнь себе и недобросовестному пользователью.
Re: Можно ли выполнить код из стека?
От: masta Россия  
Дата: 06.08.03 13:54
Оценка:
Можно.

Когда-то на сайте www.programme.ru была статья, кажется, самого Криса Касперски про выполнение кода на стеке. Всё было так детальненько и подробненько описано. Но потом она куда-то делась. Увы.

Если разыщете, сообщите в форум, ценная вещь
Re[2]: Можно ли выполнить код из стека?
От: masta Россия  
Дата: 06.08.03 13:58
Оценка:
А вот, собственно, и она.

Самомодифицирующийся код в современных ОС
Re: Можно ли выполнить код из стека?
От: Murr Россия  
Дата: 06.08.03 14:38
Оценка:
Здравствуйте, Evengar, Вы писали:

E>Вообщем, на этом мысль останавливается. Кто-нибудь, скажите что-нибудь по этом поводу. Нужно просто передать управление в область стека, в которой выполниться ret и вернет управление программе.


Код, вообще говоря, нельзя выполнять на стековых страничках (rw). Но на кривых микропроцессорах (i386 и клоны) это возможно, потому что Intel не различает атрибут read и execute.
Re[2]: Можно ли выполнить код из стека?
От: WFrag США  
Дата: 06.08.03 17:23
Оценка:
Здравствуйте, Murr, Вы писали:

M>Код, вообще говоря, нельзя выполнять на стековых страничках (rw). Но на кривых микропроцессорах (i386 и клоны) это возможно, потому что Intel не различает атрибут read и execute.


Странички не различает, сегменты различает. Вроде так. Правда, эти сегменты, по-моему, никто полноценно не использует — ограничиваются страничками.
Re[3]: Можно ли выполнить код из стека?
От: Murr Россия  
Дата: 06.08.03 18:46
Оценка:
Здравствуйте, WFrag, Вы писали:

>Правда, эти сегменты, по-моему, никто полноценно не использует — ограничиваются страничками.


Угу... потому как неудобно и несовместимо ни с одной архитектурой MMU не-Intel процессоров.
Re: Можно ли выполнить код из стека?
От: Denisuk  
Дата: 06.08.03 20:19
Оценка:
Здравствуйте, Evengar.

Ответный вотрос. Вы пишете на Асме в чистую или используете:
__asm {
...
}
ели последнее в VisualStudio, то это полная лажа, потому что написанное в последнем не как не совпадает с действительностью, т.к. я писал:
__asm {
...
push ah
...
push al
...
}

Меня обругали Warning'ами и прога не работала.
Re: Можно ли выполнить код из стека?
От: 55D  
Дата: 06.08.03 21:21
Оценка:
Здравствуйте, Evengar, Вы писали:

E>Вообщем, на этом мысль останавливается. Кто-нибудь, скажите что-нибудь по этом поводу. Нужно просто передать управление в область стека, в которой выполниться ret и вернет управление программе.


BYTE arrStack[] = { 0x90, 0xC3 };
LPVOID lpStack;
lpStack = &arrStack;
_asm call lpStack;


У меня работает ...
Re[2]: Можно ли выполнить код из стека?
От: WFrag США  
Дата: 07.08.03 02:36
Оценка:
Здравствуйте, 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.
Re[4]: Можно ли выполнить код из стека?
От: WFrag США  
Дата: 07.08.03 07:07
Оценка:
Здравствуйте, <Аноним>, Вы писали:


А>Пихать можно и 16, и 32 бита в любом режиме.


Т.е в 32-разрядном защищенном режиме можно делать так:

push ax


Мне почему-то казалось, что нельзя
Re[5]: Можно ли выполнить код из стека?
От: Аноним  
Дата: 07.08.03 13:10
Оценка:
Здравствуйте, WFrag, Вы писали:

WF>Здравствуйте, <Аноним>, Вы писали:



А>>Пихать можно и 16, и 32 бита в любом режиме.


WF>Т.е в 32-разрядном защищенном режиме можно делать так:


WF>
WF>push ax
WF>


WF> Мне почему-то казалось, что нельзя


Никакой проблемы нет. Если сегмент кода 16-битный, то
  push   ax    ; 50h
  push   eax   ; 66h 50h

а если сегмент кода 32-битный
  push   ax    ; 66h 50h
  push   eax   ; 50h

то есть в код просто добавляется префикс, указывющий размер операнда.

Вот небольшой пример.


#include <stdio.h>

void __declspec(naked) Dummy()
{
 __asm
 {
      push  eax
      push  ax
      pop   eax
      pop   ax
      nop
  }
 }

void main()
{
 unsigned char *p = (char *)Dummy;
 unsigned int   i = 0;

 while (*p != 0x90) printf("%04X: %02Xh\n", i ++, *p ++);

 }
Re[4]: Можно ли выполнить код из стека?
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.09.03 07:52
Оценка:
Здравствуйте, Аноним, Вы писали:

WF>>__asm {

WF>> ...
WF>> push ah
WF>> ...
WF>> push al // Это как? Разве так можно? Я думал, можно только 16- или 32-битные значения в стек пихать )в зависимости от режима)
WF>> ...
WF>>}

А>Пихать можно и 16, и 32 бита в любом режиме. Но вот "push ah" весьма странная операция, я даже задумался с какой "действительностью" не совпадает код внутри __asm.


push ah, push al — это недокументированные команды процессора 8086 Потом эти команды исчезли.
В стек помещалосб в любом случае слово, а не байт.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.