· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Как сделать JMP по заданному адресу или узнать EIP (коды должны быть в пределе 0x01..0x7F)

<< . 1 . 2 .

Посл.отвђт Сообщен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
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 всё находится вне допустимого диапазона...

<< . 1 . 2 .


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