2017-07-06 2 views
-2

J'ai donc quelques problèmes avec ce code d'assemblage et de trouver les deux chiffres qui sont les réponses. Tout ce que je sais, c'est que l'entrée est supposée être à deux chiffres séparés par un espace et sur la base de la dernière comparaison, le dernier chiffre devrait être égal à 0x6b qui est 107 en décimal. Func4 fait quelque chose à la valeur d'eax pour le rendre 107 mais je ne suis pas vraiment sûr. Alors, quels sont les deux nombres qui seront pris en entrée? Toute aide serait appréciée.Binary Bomb Phase 4, Intervention dans l'appel func4

0x000000000040135a <+0>: sub $0x18,%rsp 
0x000000000040135e <+4>: lea 0x8(%rsp),%rcx 
0x0000000000401363 <+9>: lea 0xc(%rsp),%rdx 
0x0000000000401368 <+14>: mov $0x402e78,%esi 
0x000000000040136d <+19>: mov $0x0,%eax 
0x0000000000401372 <+24>: callq 0x400d60 <[email protected]> 
0x0000000000401377 <+29>: cmp $0x2,%eax 
0x000000000040137a <+32>: jne 0x40138a <phase_4+48> 
0x000000000040137c <+34>: mov 0xc(%rsp),%eax 
0x0000000000401380 <+38>: cmp $0x13,%eax 
0x0000000000401383 <+41>: jle 0x40138a <phase_4+48> 
0x0000000000401385 <+43>: cmp $0x23,%eax 
0x0000000000401388 <+46>: jle 0x401395 <phase_4+59> 
0x000000000040138a <+48>: mov $0x0,%eax 
0x000000000040138f <+53>: callq *0x20340b(%rip) <explode_bomb> 
0x0000000000401395 <+59>: mov $0x23,%edx 
0x000000000040139a <+64>: mov $0x0,%esi 
0x000000000040139f <+69>: mov 0xc(%rsp),%edi 
0x00000000004013a3 <+73>: callq 0x4010bc <func4> 
0x00000000004013a8 <+78>: cmp $0x6b,%eax 
0x00000000004013ab <+81>: jne 0x4013b4 <phase_4+90> 
0x00000000004013ad <+83>: cmpl $0x6b,0x8(%rsp) 
0x00000000004013b2 <+88>: je  0x4013bf <phase_4+101> 
0x00000000004013b4 <+90>: mov $0x0,%eax 
0x00000000004013b9 <+95>: callq *0x2033e1(%rip)  <explode_bomb> 
0x00000000004013bf <+101>: add $0x18,%rsp 
0x00000000004013c3 <+105>: retq 

pas dans FUNC4

0x00000000004010bc <+0>: push %rbx 
0x00000000004010bd <+1>: mov %edx,%eax 
0x00000000004010bf <+3>: sub %esi,%eax 
0x00000000004010c1 <+5>: mov %eax,%ebx 
0x00000000004010c3 <+7>: shr $0x1f,%ebx 
0x00000000004010c6 <+10>: lea (%rbx,%rax,1),%eax 
0x00000000004010c9 <+13>: sar %eax 
0x00000000004010cb <+15>: lea (%rax,%rsi,1),%ebx 
0x00000000004010ce <+18>: cmp %edi,%ebx 
0x00000000004010d0 <+20>: jle 0x4010de <func4+34> 
0x00000000004010d2 <+22>: lea -0x1(%rbx),%edx 
0x00000000004010d5 <+25>: callq 0x4010bc <func4> 
0x00000000004010da <+30>: add %eax,%ebx 
0x00000000004010dc <+32>: jmp 0x4010ec <func4+48> 
0x00000000004010de <+34>: cmp %edi,%ebx 
0x00000000004010e0 <+36>: jge 0x4010ec <func4+48> 
0x00000000004010e2 <+38>: lea 0x1(%rbx),%esi 
0x00000000004010e5 <+41>: callq 0x4010bc <func4> 
0x00000000004010ea <+46>: add %eax,%ebx 
0x00000000004010ec <+48>: mov %ebx,%eax 
0x00000000004010ee <+50>: pop %rbx 
0x00000000004010ef <+51>: retq 
+0

Pourquoi n'utilisez-vous pas gdb pour parcourir les instructions de montage? Utilisez le mode tib gdb et enregistrez les vues pour vous aider à regarder dans les registres tout en parcourant les instructions d'assemblage. – AmeyaVS

+1

Quelle est exactement votre question? –

+0

@AmeyaVS, j'ai essayé plusieurs fois mais je ne vois pas ce qui se passe avec la valeur de% eax dans func4. – user181421

Répondre

0

la réponse à cette question est 33 107. Sur la base de la dernière déclaration de comparaison dans le code principal, nous pouvons voir que le deuxième nombre doit être équivalent à 0x6B qui est 107 en décimal sinon il va exploser. Pour obtenir le premier nombre, j'ai simplement examiné le code de vidage de func4 et j'ai vu qu'il passait par une recherche binaire. Puisque nous savons à partir du code principal que la valeur du premier nombre doit être comprise entre 19 et 35 sur la base des deux comparaisons, nous pouvons choisir 27 comme notre première estimation et voir que le nombre doit être supérieur à 27. En passant par le registres à différents stades dans le code aidé!