2015-12-05 2 views
2

Мне нужно понять, что этот код делает для перехода на вызов выхода. У меня есть только статический вид, а не динамический, потому что я не могу использовать отладчик. Это код:код сбоя препятствия

; int __cdecl main(int, char **, char **) 
main proc near 

var_14= dword ptr -14h 
var_10= dword ptr -10h 
handle= dword ptr -0Ch 
fd= dword ptr -8 
var_4= dword ptr -4 
arg_4= dword ptr 0Ch 

push ebp 
mov  ebp, esp 
sub  esp, 24h 
cmp  al, al 
jz  short near ptr loc_8048DEC+3 

xor  esp, esp 

loc_8048DEC: 
mov  dword ptr [ecx+42h], 2087D83h 
jz  short loc_8048E25 

mov  dword ptr [esp], 0Bh ; status 
call _exit 

ответ

2

разборка является запутанным путем использования перекрывающихся опкодов.

Прежде всего, инструкция 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.

 Смежные вопросы

  • Нет связанных вопросов^_^