|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 22, 2004 10:01:03 · Поправил: Black_mirror Quantum push reg32 ; загоняем адрес обработчика push 1 pop eax dec eax ; это вместо xor eax,eax push DWORD PTR fs:[eax] ; тут есть один 0xFF :-( Вместо push DWORD PTR fs:[eax] push eax pop ebx xor ebx,fs:[eax] push ebx А если что-то нужно туда записать, то: xor fs:[eax],ebx; обнуляем xor fs:[eax],reg; записываем новое значение |
|
|
Дата: Май 22, 2004 13:59:48 · Поправил: stalp Quantum А SEH тоже противопоказан? ... push reg32 ; загоняем адрес обработчика ... Потом надо вызвать null-pointer exception Спасибо за ответы. Я не знаком с механизмом обработки exception'ов... Где про это можно почитать... Под какю ОС оно работает? Мне нужно под Unix... попробовал, там при обращении к fs:[0], сразу возникает Segmentation Fault и никаких обработчиков не вызывается... |
|
|
Дата: Май 22, 2004 20:49:09 stalp Вобщем посмотрел, беседа была такая, не совсем то что тебе нужно или совсем не то, но я все же решил запостить, вдруг кто-то захочет продолжить изыскания ;-) ====================================================================== ============ Запись в память (DOS) guHo3ABP ---------------------------------------------------------------------- ---------- Была поставлена цель сделать reboot.com (ессно досовский), который не содержал бы непечатных символов (цель дурацкая, но не суть). Получилось вот что: h55X5;4P^J04RS4 Или, другими словами: 00000000: 683535 push 03535 ;"55" 00000003: 58 pop ax 00000004: 353B34 xor ax,0343B ;"4;" 00000007: 50 push ax 00000008: 5E pop si 00000009: 4A dec dx 0000000A: 3034 xor [si],dh 0000000C: 52 push dx 0000000D: 53 push bx 0000000E: 34 xor al,000 ;" " под дебаггером всё срабатывает как в лучших домах; если же запустить в "свободное плавание", то мимо xor [si],dh пролетает молча. Гуру, отзовитесь!!! Объясните мне, неучу, почему так происходит? ====================================================================== =========== Re: Запись в память (DOS) Sten ---------------------------------------------------------------------- ---------- Т.к. я уже давно не занимался DOC-ом то ответ будет несколько приблизительный. Какой у тебя проц? Как я понял, твой код пытается подпатчить инструкцию по адресу 10E в памяти. (кстати, во что он пытается ее превратить? Я не помню уже что содержит регистр DX при загрузке com-файла.) В общем, был такой старый анти-отладочный прием. Патчилась инструкция, которая шла сразу за текущей инструкцией. При этом под отладчиком она действительно патчилась, а при обычном выполнении нет. Это связано с наличием у процессора конвейера. Т.е. процессор считывает n-ое количество байт (кажется 16) прежде чем выполнять инструкцию. И следующая инструкция, если она поместилась в этот конвейер берется уже не из памяти а из конвейера. Это что-то типа кэша. Отладчик, не эмулирует этот конвейер, а считывает инстукцию из памяти в любом случае. Поэтому работает не правильно. (в твоем случае все наооборот - отладчик все делает правильно, а.. :) Короче говоря попытайся вставить побольше nop-ов после инструкции xor [si],dh. Не менее 16-ти, чтобы инстукция по адресу 10Е не попала в конвейер. P.S. Насчет проца - как я помню у пня и выше нет никакого конвейера.. ================================================================================ guHo3ABP ---------------------------------------------------------------------- ---------- >Какой у тебя проц? под рукой нет ни одного ниже P-II. >... (кстати, во что он пытается ее превратить? Я не помню уже что содержит регистр DX при загрузке com-файла.) не буду претендовать на авторитетность, ибо выяснил экспериментальным путём: в CX - размер com-файла, остальные регистры общ. назначения обнулены. кстати, используя этот факт, можно сделать reboot.com размером 4 байта: 00000000: 48 dec ax 00000001: 50 push ax 00000002: 53 push bx 00000003: CB retf >Т.е. процессор считывает n-ое количество байт (кажется 16) вот немного изменённый вариант, патчится байт, находящийся ~ +0x40h симптомы те же... диагноз? 00000000: 683535 push 03535 ;"55" 00000003: 58 pop ax 00000004: 356534 xor ax,03465 ;"4e" 00000007: 50 push ax 00000008: 5E pop si 00000009: 4A dec dx 0000000A: 683434 push 03434 ;"44" 0000000D: 58 pop ax 0000000E: 203C and [si],bh 00000010: 3024 xor [si],ah 00000012: 3034 xor [si],dh 00000014: 3D3333 cmp ax,03333 ;"33" 00000017: 7737 ja 000000050 З.Ы. повторюсь, целью было сделать reboot.com, содержащий байты из диапазона 0х20-0х7F ================================================================================ Sten ---------------------------------------------------------------------- ---------- >>... (кстати, во что он пытается ее превратить? Я не помню уже что содержит регистр DX при загрузке com-файла.) >не буду претендовать на авторитетность, ибо выяснил экспериментальным путём: в CX - размер com-файла, остальные регистры общ. назначения обнулены. Ты так и не ответил на мой вопрос, какую инструкцию ты хотел получить? А насчет авторитетов, я сейчас загрузил твой пример в единственной DOS-отладчик, который оказался под рукой - avputil.com. При загрузке CX = FF, DX = 1811. Cоответственно твой пример не работал. Ты лучше уточни что все-таки содержат регистры. кстати, используя этот факт, можно сделать reboot.com размером 4 байта: 00000000: 48 dec ax 00000001: 50 push ax 00000002: 53 push bx 00000003: CB retf > А можно не используя этого факта в два байта :) - 00000000: CD 19 INT 19 Это по памяти опять же, но должно работать. ====================================================================== =========== |
|
|
Дата: Май 22, 2004 20:52:42 Black_mirror Спасибо! stalp Под какю ОС оно работает? Win32 :-( |
|
|
Дата: Май 24, 2004 07:24:26 stalp Итак, мы выяснили, что из команд передачи управления можно применять только условные короткие относительные переходы, причем только вперёд. Значит, остается только одно - выяснить, что пациент кладет на стек перед нашей программой. Возможно, там найдётся нечто полезное... И не совсем понятно, что означает [ смещение относительно содержимого esp или какого-нибудь другого регистра высчитать _невозможно_!!!! по условию... ] что-то ещё переменной длины кладется сверху? |
|
|
Дата: Май 24, 2004 10:21:34 2) Как можно узнать адрес выполняемого в данный момент кода... (смещение относительно содержимого esp или какого-нибудь другого регистра высчитать _невозможно_!!!! по условию...) push 0c3h mov eax,esp call eax mov eax,[esp-4] Это самый тупой пример, есть более простой, из двух комманд, что-то типа
call $+4
pop eax
|
|
|
Дата: Май 24, 2004 13:24:48 call $+4 pop eax Народ... пожайлуста, внимательнее читайте условия... ВСЕ БАЙТЫ КОДА ДОЛЖНЫ УДОВЛЕТВОРЯТЬ УСЛОВИЮ ВХОЖДЕНИЯ В ДИАПАЗОН: [0x01-0x7F]... call - недопустимая комманда, как и её параметры: E8,FF,FF,FF,FF или E8,00,00,00,00 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ всё находится вне допустимого диапазона... |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.116 |