Привет!
Прилагаю эксперименты по защите стеков от переполнения/исчерпания.
TEST'ы - для испытания защиты.
В исходном варианте (без вызова MEMPROT) только TEST3 (исчерпание стека
данных) дает ловимое исключение, остальные три теста слетают.
При выделении стека данных в отдельную область памяти с защитой её
границ аппаратно. TEST (переполнение стека данных) ловится нормально,
TEST3 тоже ловится лучше - на первой же попытке взять ниже вершины.
А вот переполнение/исчерпание стека возвратов поймать не удается. Точнее,
ловить вроде как удается (тем же способом - аппаратной защитой границ), но
обработать - нет. Т.е. выглядит это по-прежнему как вылет. Видимо дело в
обработчике - в (ENTER) на входе в (EXT):
- если попадаем в обработчик при переполнении стека возвратов, то первый
же PUSH (внутри (ENTER)) вызывает вложенное исключение, т.е. вылет.
- если исключение при исчерпании стека возвратов, то на тот момент
видимо уже затерт SEH-фрейм с адресом нашего обработчика.
Есть идеи, как лучше ловить сбои с RP ? Защитой SEH-фрейма? (он меньше
страницы - защитой RP сделается вообще неюзабельным). Выносом SEH
в отдельную область памяти? Переписью (EXT) или заменой там (ENTER)?
Кстати, относительно свежая статья про SEH:
http://wasm.ru/article.php?article=veh--
Андрей
WINAPI: VirtualProtect KERNEL32.DLL
WINAPI: VirtualAlloc KERNEL32.DLL
0x02 CONSTANT PAGE_READONLY
0x04 CONSTANT PAGE_READWRITE
0x1000 CONSTANT MEM_COMMIT
0x2000 CONSTANT MEM_RESERVE
: MEMPROT
PAGE_READWRITE MEM_COMMIT MEM_RESERVE OR 16 1024 * 0 VirtualAlloc DUP 0= THROW >R
PAD PAGE_READONLY 4096 R@ VirtualProtect 0= THROW
PAD PAGE_READONLY 4096 R@ 4096 3 * + VirtualProtect 0= THROW
R> 4096 3 * + 4 - DUP S0 ! SP!
100000 BEGIN DUP >R 1- DUP 0= UNTIL DROP
100000 BEGIN RDROP 1- DUP 0= UNTIL DROP
PAD PAGE_READONLY 2 R0 @ 400000 - VirtualProtect 0= THROW
PAD PAGE_READONLY 2 R0 @ 4092 + DUP HEX U. DECIMAL VirtualProtect 0= THROW
;
MEMPROT
\ òåñòû ïåðåïîëíåíèÿ
: TEST
BEGIN
9 DEPTH .
AGAIN
;
: TEST2
BEGIN
9 >R RP@ R0 @ - .
AGAIN
;
\ òåñòû èñ÷åðïàíèÿ
: TEST3
BEGIN
DROP DEPTH .
AGAIN
;
: TEST4
BEGIN
RDROP RP@ R0 @ - .
AGAIN
;
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev