
- •Лабораторная работа №6 «Команды работы с данными»
- •Раздел 1
- •«Команды перемещения данных»
- •1 Nop (No Operation)
- •2 Push (push operand onto stack)
- •3 Pop (pop operand from the stack)
- •4 Pushad (push All general Double word registers onto stack)
- •5 Popad (pop All general Double word registers from the stack)
- •6 Mov (moVe operand)
- •9 Lea (Load Effective Address)
- •10 Xchg (Exchange Register/Memory with Register)
- •Раздел 2 «Математические команды»
- •1 Inc (inCrement operand by 1)
- •2 Dec (deCrement operand by 1)
- •3 Add (adDition)
- •4 Adc (aDdition with Carry)
- •5 Sub (suBtract)
- •6 Sbb (SuBtract with Borrow)
- •7 Mul (muLtiply)
- •8 Imul (Integer muLtiply)
- •9 Div (diVide unsigned)
- •10 Idiv (Integer diVide)
- •11 Xadd (eXchange and add)
- •12 Neg (neGate operand)
Лабораторная работа №6 «Команды работы с данными»
Раздел 1
«Команды перемещения данных»
Цель работы:
Научиться распознавать и выполнять команды перемещения данных.
Методические указания:
Для подготовки лабораторной работы использовать:
программу OllyDbg;
исполняемый файл – Crackme.exe.
методические указания по лабораторной работе.
Команды пересылки данных составляют следующие подгруппы: команды работы с указателями и адресами – LEA, LDS, LSS, LES, LFS; стековые - представляет собой набор специализированных команд, ориентированных на организацию гибкой и эффективной работы со стеком; пересылки цепочек – реализует разнообразные варианты пересылки; ввода-вывода.
1 Nop (No Operation)
Это команда занимает один байт, при запуске не производит никаких изменений в регистрах, стеке или памяти, у нее нет никакого специального назначения, и поэтому ее можно использовать, например, если нужно заменить одну команду на другую, более короткую. Также она служит для полного уничтожения другой команды.
Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале представлен оригинальный код программы, для того чтобы изменить первую команду PUSH 0, которая имеет размер два байта, на NOP нужно выделить соответствующую строку щелчком левой кнопкой мыши, как показано на рисунке 1.1 и вызвать окно Assemble.
Рисунок 1.1 – Disassembler window
В окне Assemble вводится команда NOP. Так как команда PUSH занимает два байта, то на месте этой команды появятся две команды NOP с адресами 401000 и 401001, как показано на рисунке 1.2, которые при исполнении ничего не делают.
Рисунок 1.2 – Disassembler window
Чтобы просмотреть два новых байта в области окна Dump в контекстном меню нужно выбрать команду Go to – Expression в окне Enter expression to follow in …ввести адрес, где расположены требуемые байты. Данная операция показана на рисунке 1.3.
Рисунок 1.3 – Enter expression to follow in …
В окне Dump, показанном на рисунке 1.4 измененные байты выделены красным цветом.
Рисунок 1.4 – Dump
2 Push (push operand onto stack)
Команда PUSH используется для записи значений в стек и извлечения их из стека. Размер записываемых значений — слово или двойное слово. Также в стек можно записывать непосредственные значения.
Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. Первая команда в этой программе – PUSH. В данном случае это PUSH 0 и в дальнейшем при выполнении, данная команда поместит 0 на самый вверх стека, а то, что было до этого наверху, окажется под этим значением. До выполнения команды начальное значение стека по адресу 12FFC4 равно 7C816D4F и показано на рисунке 1.5.
Рисунок 1.5 – Stack window
Для того чтобы выполнить команду PUSH 0 нужно щелкнуть левой кнопкой мыши в окне Disassembler window по строке содержащей эту команду. Затем нажать клавишу F7.
По нажатию F7, по адресу 12FFC4 по–прежнему находится значение 7C816D4F, и ни одно из других значений в стеке также не изменилось. Но самое верхнее значение стека теперь по адресу 12FFC0, как показано на рисунке 1.6. Также регистр ESP, в котором находится адрес самого верхнего значения стека, содержит 12FFC0.
Рисунок 1.6 – Stack window
Команда PUSH имеет несколько вариантов, позволяющих помещать в стек не только числа: PUSH EAX помещает значение EAX наверх стека. Подобным образом можно поместить в стек значение любого регистра.
Чтобы поместить в стек число 401008, нужно щелкнуть левой кнопкой мыши в окне Disassembler window по строке с командой PUSH 0, затем при помощи окна Assemble ввести команду PUSH 401008.
После выполнения команды, в стек будет помещено число 401008, как показано на рисунке 1.7.
Рисунок 1.7 – Stack window
Чтобы в стек поместить содержимое ячейки памяти по адресу 401008, необходимо в окне Assemble ввести команду PUSH [401008]. В окне Dump можно просмотреть, что находится по адресу 401008 при помощи операции Go to.
В данном случае, на рисунке 1.8 видно, что по этому адресу в этих четырёх байтах находятся CA204000.
Рисунок 1.8 – Dump
После запуска команды PUSH [401008] в стеке находятся значение CA204000, но байты помещены в обратном порядке и это видно на рисунке 1.9.
Рисунок 1.9 – Stack window