
- •Лабораторная работа №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 Mov (moVe operand)
Команда MOV применяется для различного рода пересылок данных, при этом, несмотря на всю простоту этого действия, необходимо помнить о некоторых ограничениях и особенностях выполнения данной операции:
направление пересылки в команде MOV всегда справа налево, то есть из второго операнда в первый;
значение второго операнда не изменяется;
лишь один из операндов может быть сегментным регистром.
Для разбора команды, нужно открыть в программе OllyDbg файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. С помощью окна Assemble необходимо заменить эту команду на команду MOV EAX, EBX. До выполнения MOV EAX, EBX значение EAX – 00000000, а EBX – 7FFD7000, как показано на рисунке 1.18.
Рисунок 1.18 – Registers window, до выполнения команды MOV EAX, EBX
В окне Disassembler window необходимо выделить строку с командой MOV EAX, EBX и нажать клавишу F7. Значение регистра EBX переместиться в регистр EAX, как показано на рисунке 1.19, при этом значение регистра EBX не изменится.
Рисунок 1.19 – Registers window, после выполнения команды MOV EAX, EBX
Так же при помощи команды MOV можно переслать значение из регистра CL в регистр AL (AL - это две последних цифры регистра EAX и CL - две последних цифры регистра ECX). Для разбора команды необходимо заново открыть в программе OllyDbg файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. При помощи окна Assemble требуется заменить эту команду на команду MOV AL, CL. Для выполнения команды следует нажать клавишу F7. Изменения в состоянии регистров до и после выполнения команды, показаны на рисунке 1.20.
Рисунок 1.20 – Изменение значений в Registers window
Также можно переместить содержимое какого-либо регистра в нужную ячейку памяти или наоборот. Так, к примеру, требуется переместить содержимое по адресу 405000 в регистр EAX. Для этого снова необходимо открыть в программе OllyDbg файл Crackme.exe. В окне Dump при помощи операции Go to можно просмотреть содержимое ячейки памяти по адресу 405000. И как показано на рисунке 1.21 - содержимое ячейки памяти - 00100000.
Рисунок 1.21 – Dump
Следующий шаг – это замена при помощи окна Assemble команды PUSH 0 на MOV EAX,DWORD PTR DS:[405000]. Затем, выделив строку с командой NOP по адресу 401005, показанной на рисунке 1.22, нажимается клавиша F7. Для перемещения четырех байтов используется слово DWORD, для перемещения двух байтов - WORD, а слово BYTE - для перемещения одного байта.
Рисунок 1.22 – Disassembler window
Так как в памяти содержимое хранится в перевёрнутом виде, то в регистр EAX попадёт 00001000, как показано на рисунке 1.23.
Рисунок 1.23 – Registers window
Для того чтобы записать значение по данному адресу (405000), необходимо ввести команду MOV DWORD PTR DS:[405000],EAX.
Команда MOV AX,WORD PTR DS:[405008] перемещает два байта из памяти по адресу 405008 в регистр AX, остальная часть регистра EAX остается неизменной.
Команда MOV AL, BYTE PTR DS:[405008] перемещает один байта из памяти по адресу 405008 в регистр AL, остальная часть регистра EAX остается неизменной.
7 MOVSX (MOVe with Sign-Extension)
Команда MOVSX копирует содержимое второго операнда, который может быть регистром или адресом памяти, в первый (который должен быть в два раза больше, чем второй), заполняя остальные биты слева значением самого значимого бита второго операнда.
Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. При помощи окна Assemble нужно заменить эту команду на команду MOVSX EAX, BX. Далее выделив строку, с измененной командой нажать F7, как показано на рисунке 1.24.
Рисунок 1.24 – Disassembler window
В данном случаи значение регистра EAX – 00000000 и BX – 5000.
Примечание: значение регистра BX может отличаться от этого.
После выполнения команды в регистр AX скопировался BX, который содержал 5000. Итоговое значение регистра EAX стало 00005000, как показано на рисунке 1.25.
Рисунок 1.25 – Registers window
Остальные байты заполнились нулями, так как 5000 - это положительное 16-битное число. Если бы регистр BX имел отрицательное значение (8000), то биты заполнились бы отрицательным значением FFFF. Числа от 0000 до 7FFF являются положительными, а все, что выше до FFFF – отрицательными.
8 MOVZX (MOVe with Zero-Extend)
Команда MOVZX похожа на предыдущую, но в данном случае свободные байты просто заполняются нулями и не зависит от того, является ли второй оператор положительным или нет.
Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. При помощи окна Assemble сделать замену этой команды на команду MOVZX EAX, BX. До выполнения команды регистр EAX содержит значение 00000000, а BX 8000, это показано на рисунке 1.26.
Рисунок 1.26 – Registers window
Далее необходимо выделить строку с командой NOP по адресу 00401003 и нажать клавишу F7, для выполнения команды. Значение регистра EAX станет равным 00008000, как показано на рисунке 1.27, несмотря на то, что регистр BX имел отрицательное значение.
Рисунок 1.27 – Registers window