Код оболочки, шелл-код (англ.shellcode) — это двоичный исполняемый код, который обычно передаёт управление консоли, например '/bin/sh' Unixshell, command.com в MS-DOS и cmd.exe в операционных системахMicrosoft Windows. Код оболочки может быть использован как полезная нагрузка эксплойта, обеспечивая взломщику доступ к командной оболочке (англ.shell) в компьютерной системе. Шелл-код обычно внедряется в память эксплуатируемой программы, после чего на него передается управление путём переполнения стека, или при переполнении буфера в куче, или используя атаки форматной строки.
Передача управления шелл-коду осуществляется перезаписью адреса
возврата в стеке адресом внедрённого шелкода, перезаписью адресов
вызываемых функций или изменением обработчиков прерываний. Результатом
этого является выполнение шелл-кода, который открывает командную строку
для использования взломщиком.
1) Основное отличие - внутри блока asm..end не допускается объявление
обычных именованных переменных и меток, за исключением меток с именами,
начинающимися на "@".
Например, если в MASM\TASM можно объявить в коде константу X dd 0
и грузить ее в регистр как mov eax,X то в дельфях это не прокатывает и
нужно использовать одно из двух:
а) либо убрать объявление X dd 0, а в начале функции (до "asm") объявить const X:dword = 0;
б) либо заменить имя X на метку @X: dd 0 и грузить ее как mov eax,dword[@X]
Тоже самое с метками - нужно либо объявить все используемые метки
вначале функции (label ...), либо заменить имена меток, чтобы они
начинались с символа @. Также не поддерживаются анонимные метки @@: +
jcc @B или jcc @F и фасмовские локальные метки, начинающиеся с точки.
Еще одно ограничение - все метки в дельфях являются локальными, поэтому
перепрыгнуть из одной функции внутрь другой не получится (только на
начало).
2) Передача параметров функций. Во-первых, по умолчанию
используется вызов register и три первых параметра размером не более
dword передаются через регистры eax,edx,ecx. Это нужно иметь ввиду,
чтобы ненароком их не затереть, например function
foo(X,Y:integer):integer; mov eax,Y - затирает параметр X, т.к. здесь
X==eax, Y==edx. С вызовами pascal или stdcall конечно таких проблем
нет, поэтому для asm-функций лучше всегда явно указывать тип вызова,
чтобы знать что к чему независимо от настроек по умолчанию. Ну ес-но
var и const параметры рассматриваются как указатели на переменные:
procedure foo(var X:integer); mov ecx,X - грузит указатель на X при
любом типе вызова, а вот mov ecx,[X] при register грузит значение
переменной X (==mov ecx,[eax]), но для pascal\stdcall по прежнему
грузится указатель, т.к. одна операция mov не может сделать две
загрузки из памяти и mov eax,X == mov eax,[X] == mov eax,[ebp+8].
Комбинация mov ecx,X + mov ecx,[ecx] ес-но работает при любом вызове.
3) Прологи\эпилоги не генерятся только при условии: тип вызова
register, число параметров <= 3 и все они передаются через регистры,
нет объявления локальных переменных. В остальных случаях компилятор
всегда вставляет пролог push ebp + mov ebp,esp + при объявлении
локальных add esp,-(размер_локальных) и соответсвующий эпилог. Ес-но
при наличии пролога\эпилога нужно аккуратно обращться с ebp и ret
PS: Если у тебя есть готовый код на асме, то возможно проще его
скомпилить на том же асме в obj и инклюдить к дельфям - останется
только обявить external функции из готового obj. при экспорте из obj файла могут возникнуть проблемы (если это не TASM)
т.к. у дельфы obj omf, а не obj coff и тебе понадобится тулза для
конверта: COFF2OMF.exe вроде есть в дистрибе С Builder-a или так где
скачай.
21 СПОСОБ ОБНУЛИТЬ РЕГИСТР
~~~~~~~~~~~~~~~~~~~~~~~~~~
Как-то ночью, от незаин делать был написан это текст. Здесь приводятся
всякие способы обнуления регистров - от простых и до самых изощренных, но
вот чего тут нет - так это полных извращений, типа обнуления по одному
биту, автогенерируемого кода и т.п.
1. Обнуление MOV-ом
mov r, 0
2. Заменяем MOV на эквивалентные ему PUSH и POP
push <something-equal-to-0>
pop r
3. Самый хакерский способ: вычитаем регистр сам из себя.
sub r, r
4. Ксорим (тоже неплохой способ... но... как-то не то...)
Попутно (c) на название картины: "арвихакер, ксорящий ворды в уме"
xor r, r
5. Тоже неплохой способ, правда назаин никому не нужный.
and r, 0
6. Более хитро: умножим на 0.
imul r, 0
7. Сдвиг (не путать со спрыгом).
X1+X2 в сумме больше/равно размера регистра в битах,
по отдельности меньше. Меньше потому, что берется по модулю.
14. Более хитро: прочитаем 0 из порта (например порт 81h)
mov dx, <some-port-number>
in al, dx
15. Опять AL
stc
setnc al
16. А тут кто-нибудь в доку полезет. 5 раз bsf либо bsr.
bsf r, r
bsf r, r
bsf r, r
bsf r, r
bsf r, r
17. Воспользуемся нулевым дескриптором из GDT
sgdt [esp-6]
mov r, [esp-4]
mov r, [r]
18. Считаем ноль из сегмента FS (PE файл)
mov r, fs:[10h] ; константа по вкусу, был бы ноль
19. Цикл (повторюсь: здесь главное не озаинеть)
inc/dec r ; это несколько долго
jnz $-1
20. Вызовем какую-нить функцию с кривыми параметрами (вернется NULL в EAX)
call GetCurrentObject
21. Используем сопроцессор
fldz
fistp dword ptr [esp-4]
mov eax, [esp-4]
22, 23, 24, ...
Предлагаются также следующие варианты обнуления регистра:
- сканирование цепочки обработчкиков SEH до победного нуля
- сканирование цепочки хендлов файлов до нуля
(для этого надо сначала положить в регистр хендл открытого файла
нулевого кольца, а перед этим перейти в ноль и открыть этот файл)
- считывание нуля из случайного файла
(потребуется генератор случайных чисел)
- вычисление синуса от Pi * n (умножать командой FMUL)
- сортировка памяти и поиск нуля как минимального элемента
- определение нуля как константы (в исходнике)
- создание специального макроса для генерации нуля
DOS это операционная система с консольной платформой. Windows 3.X, 9X,
ME базируются на этой ОС. Её размер состовляет < 1mb. В данный
момент DOS используют в основном как альтернативный загрузчик.
www.freedos.org FreeDOS (Немного глючная, почти полнустью написана на С, 16-bit) www.drdos.org Enhanced DR-DOS (Не посещайте drdos..com !!! Я вас предупреждал.) (16-bit) http://freedos-32.sourceforge.net/ (32-bit, DPMI совместимый, dead ?) http://dex4u.com/ DexOS (32-bit, несовместимый с 16-bit RM и DPMI) http://bos.asmhackers.net/ BOS (Косит под DexOS, pre-alpha, игрушка)