2015-12-05 1 views
2

Je dois comprendre ce que ce code fait pour passer l'appel de sortie. J'ai seulement une vue statique et pas une dynamique parce que je ne peux pas utiliser un débogueur. Voici le code:sauter obstacle assemblage code

; 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 

Répondre

2

Le démontage est obscurcie par l'utilisation de opcodes qui se chevauchent.

Tout d'abord, l'instruction cmp al, al est garanti pour définir l'indicateur zéro, quel que soit le contenu de al. Le saut conditionnel jz sera donc pris sur la ligne suivante.

Le jz saute trois octets dans l'instruction mov dword ptr [ecx+42h], 2087D83h. La représentation hexadécimale pour cette instruction est c7 41 42 83 7d 08 02 . Donc, nous commençons réellement à exécuter au 83.

Mais 83 7d 08 02 se désassemble à cmp dword ptr [ebp+8], 2. Notez que parce que ceci se termine sur la même limite d'instruction que l'instruction trompeuse mov que l'IDA affiche, les instructions suivantes à exécuter s'alignent avec le désassemblage qui vous est donné par IDA. Alors, dans la ligne suivante, jz short loc_8048E25, nous ne passerons à loc_8048E25 que si le drapeau zéro est activé; c'est-à-dire, si [ebp+8] (qui est notre premier paramètre à main, c'est-à-dire, argc) est égal à 2. Sinon, nous passons et exécutons les deux instructions suivantes, qui correspondent à exit(11).

Pour fixer le démontage dans l'IDA ...

Vous pouvez désassembler l'instruction mov en cliquant sur la ligne mov et appuyez sur la touche u. Vous pouvez également commencer le réassemblage à loc_8048DEC+3 avec la clé c. Vous devriez enregistrer votre base de données avant de le faire.

1. De nombreux mnémoniques peuvent être représentés par plus d'une séquence d'octets. Par exemple, cette instruction particulière pourrait également être représentée comme étant c7 81 42 00 00 00 83 7d 08 02 mais A) les compilateurs ont tendance à générer la forme la plus courte d'une instruction, et B) les instructions qui se chevauchent ne seraient pas "compréhensibles" et risqueraient de segfault. L'IDA peut vous montrer la représentation en octets réelle de chaque instruction soit dans la vue hexadécimal, soit si vous définissez Opcodes > General > Number of opcode bytes de manière appropriée.