· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.RESEARCH —› Как обработать неправильное значение?

Посл.отвђт Сообщенiе


Дата: Июн 2, 2003 02:33:07

Заранее извиняюсь за неправильное употребление терминов и т.д. Не специалист я, поэтому и спрашиваю совета.

Есть программа, судя по сигнатуре писанная на vc32. При определенном и известном воздействии пользователя программа падает. Исходников программы нет.
С помощбю IDA и Soft Ice нашел процедуру в которой происходит ошибка:

push ebp
mov ebp, esp
push ecx
mov [ebp+var_4], ecx
mov eax, [ebp+arg_0]
movsx edx, word ptr [ecx+4]
imul edx, 46h
mov eax, [ebp-4]
lea ecx, [eax+edx+8]
mov edx, [ebp+0Ch]
mov eax, [edx+14h]
movsx edx, word ptr [eax+4]
movsx eax, byte ptr [ecx+edx]

тут неважно как вычисляется результат
процедуры и заносится в eax

mov esp, ebp
pop ebp
retn 8

Падение происходит на первом movsx когда ecx=0
или на втором и третьем movsx когда
[eax+4] или [ecx+edx] ссылаются на неопределенную область памяти.

Вопрос: каким путем можно поправить эту процедуру, чтобы избежать падения программы?
Проверить ecx на 0 в первом случае - это понятно, но что делать во втором и третьем?
Или есть более правильный путь?

Процедура после изменения может увеличиться в размере, т.к. рядом есть неиспользуемый код достаточного размера.

И дополнительный вопрос - зачем нужен push ecx если ecx нигде не восстанавливается?


Дата: Июн 2, 2003 03:10:04

Только проверку на ecx=0. Все остальный movsx зависят от значения ecx.


Дата: Июн 2, 2003 03:39:00

2 severe44:
И дополнительный вопрос - зачем нужен push ecx если ecx нигде не восстанавливается?

Вообще-то принцип стека состоит в том, что последние положенные в него данные восстанавливаются первыми, независимо от того как они клались (через EAX, ECX, и т.д.).

Судя по твоему коду:
push ebp
mov ebp, esp
push ecx
...
pop ebp
можно сказать, что pop ebp как раз и восстанавливает значение, положенное при push ecx.


Дата: Июн 2, 2003 05:05:58

Sk. Inc.
pop ebp как раз и восстанавливает значение, положенное при push ecx
Заблуждаетесь, ибо:
[code]
mov ebp, esp
...
mov esp, ebp
[/code]


Дата: Июн 2, 2003 11:40:41

Только проверку на ecx=0. Все остальный movsx зависят от значения ecx.
Это понятно, но как отследить и предупредить ситуацию, когда во втором и третьем movsx происходит обращение к "чужой" или неиспользуемой памяти (в Soft Ice ее содержимое не определено - ?? ?? ?? ...).
Проблема в том, что глики во втором и третьем movsx не зависят от ecx=0 и возникают в других случаях.


Дата: Июн 2, 2003 12:04:22 · Поправил: P2M

severe44
нашел процедуру в которой происходит ошибка
Из Вашего кода не понятно где инициализируется ECX?

Процедура после изменения может увеличиться в размере ...
Можно перед обращением в "чужую" память проверять IsBadReadPtr.

зачем нужен push ecx если ecx нигде не восстанавливается?
Например, для места под локальную переменную(ые) размером в DWORD вместо add esp,4. В win32-app восстанавливать значение ecx не обязательно.


Дата: Июн 2, 2003 13:08:23

[ severe44: Вопрос: каким путем можно поправить эту процедуру, чтобы избежать падения программы? ]

Не совсем ясен вопрос. Все завязано на значении, которое содержится в ecx. А туда оно попадает еще до входа в процедуру.
Если же нужно просто избежать падения можно просто поставить SEH-обработчик. Но, тогда не ясно зачем эта процедура вообще нужна.


Дата: Июн 2, 2003 16:28:38

severe44
нашел процедуру в которой происходит ошибка
Из Вашего кода не понятно где инициализируется ECX?


Логично предположить что в ecx находится this класса, и через [ecx+4] читаются его члены.


Дата: Июн 19, 2003 13:05:05

Если же нужно просто избежать падения можно просто поставить SEH-обработчик.

Что такое SEH-обработчик? И как его поставить или где увидеть примеры? :)


Дата: Июн 19, 2003 13:05:34

Если же нужно просто избежать падения можно просто поставить SEH-обработчик.

Что такое SEH-обработчик? И как его поставить или где увидеть примеры? :)


Дата: Июн 20, 2003 11:35:20

Адрес задается через селектор FS и смещение 0 (пользовательский код). Примеры (вроде) есть в исходниках этого сайта.


Дата: Июн 20, 2003 14:12:25

Пример примитивного SEH есть у Iczelion в PE-tutorial "Урок 5. Таблица секций" - на сайте есть перевод.
Если хочешь досконально разобраться с SEH ищи статью "Win32 Exception handling for assembler programmers" by Jeremy Gordon.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.090