разборка является запутанным путем использования перекрывающихся опкодов.
Прежде всего, инструкция cmp al, al
гарантирует установку нулевого флага независимо от содержания al
. Таким образом, будет сделан условный переход на следующую строку.
jz
прыгает три байта в инструкцию mov dword ptr [ecx+42h], 2087D83h
. Шестиугольное представление для этой команды: c7 41 42 83 7d 08 02
. Поэтому мы фактически начинаем работу с 83
.
Но 83 7d 08 02
разбирает до cmp dword ptr [ebp+8], 2
. Обратите внимание, что поскольку это заканчивается на той же границе инструкции, что и вводящая в заблуждение инструкция mov
, которую отображает IDA, следующие выполняемые команды выстраиваются в линию с разборкой, предоставленной вам IDA.
Итак, в следующей строке, jz short loc_8048E25
, мы перейдем только к loc_8048E25
, если установлен флаг нуля; то есть, если [ebp+8]
(что является нашим первым параметром main
, то есть argc
) равно 2
. В противном случае мы провалимся и выполним следующие две инструкции, которые равны exit(11)
.
Чтобы исправить разборку в IDA ...
Вы можете дизассемблировать в mov
инструкцию, нажав на mov
линии и нажав клавишу u
. Аналогичным образом вы можете начать сборку в loc_8048DEC+3
с помощью ключа c
. Прежде чем делать это, вы должны сохранить свою базу данных.
1. Многие мнемоники могут быть представлены более чем одной последовательностью байтов. Например, эта конкретная инструкция также может быть представлена как c7 81 42 00 00 00 83 7d 08 02
, но A) компиляторы имеют тенденцию генерировать кратчайшую форму инструкции, а B) полученные наложенные инструкции не будут «иметь смысл» и, вероятно, будут segfault. IDA может показать фактическое представление байтов каждой команды либо в Hex View, либо если вы правильно установили Opcodes > General > Number of opcode bytes
.