title: assembly quiz - phase6
body: <p>I've been solving the quiz about assembly codes but the Quiz6(phase 6) is really hard for me to figure out what is it doing.
  I just catch that the input of phase 6 is <strong>six integers</strong>, each integer is identical, and under equal 6.
  I wrote some other details inside of the code lines below.</p>
  
  <p>What Phase_6 says:</p>
  
  <pre><code>Dump of assembler code for function phase_6:
  =&gt; 0x00005555555554fd &lt;+0&gt;: push   %r14
     0x00005555555554ff &lt;+2&gt;: push   %r13
     0x0000555555555501 &lt;+4&gt;: push   %r12
     0x0000555555555503 &lt;+6&gt;: push   %rbp
     0x0000555555555504 &lt;+7&gt;: push   %rbx
     0x0000555555555505 &lt;+8&gt;: sub    $0x60,%rsp
     0x0000555555555509 &lt;+12&gt;:    mov    %fs:0x28,%rax
     0x0000555555555512 &lt;+21&gt;:    mov    %rax,0x58(%rsp)
     0x0000555555555517 &lt;+26&gt;:    xor    %eax,%eax
     0x0000555555555519 &lt;+28&gt;:    mov    %rsp,%r13
     0x000055555555551c &lt;+31&gt;:    mov    %r13,%rsi
     0x000055555555551f &lt;+34&gt;:    callq  0x555555555aba &lt;read_six_numbers&gt;
     0x0000555555555524 &lt;+39&gt;:    mov    %r13,%r12
     0x0000555555555527 &lt;+42&gt;:    mov    $0x0,%r14d
     0x000055555555552d &lt;+48&gt;:    jmp    0x555555555554 &lt;phase_6+87&gt;
     0x000055555555552f &lt;+50&gt;:    callq  0x555555555a7e &lt;explode_bomb&gt;
     0x0000555555555534 &lt;+55&gt;:    jmp    0x555555555563 &lt;phase_6+102&gt;
     0x0000555555555536 &lt;+57&gt;:    add    $0x1,%ebx
     0x0000555555555539 &lt;+60&gt;:    cmp    $0x5,%ebx
     0x000055555555553c &lt;+63&gt;:    jg     0x555555555550 &lt;phase_6+83&gt;
     0x000055555555553e &lt;+65&gt;:    movslq %ebx,%rax
     0x0000555555555541 &lt;+68&gt;:    mov    (%rsp,%rax,4),%eax
     0x0000555555555544 &lt;+71&gt;:    cmp    %eax,0x0(%rbp)
     0x0000555555555547 &lt;+74&gt;:    jne    0x555555555536 &lt;phase_6+57&gt;
     0x0000555555555549 &lt;+76&gt;:    callq  0x555555555a7e &lt;explode_bomb&gt;
     // Upper cods seems to test the identicality and integers are under equal 6
  
  
     //And I have no idea what are below codelines do. From here...
     0x000055555555554e &lt;+81&gt;:    jmp    0x555555555536 &lt;phase_6+57&gt;
     0x0000555555555550 &lt;+83&gt;:    add    $0x4,%r13
     0x0000555555555554 &lt;+87&gt;:    mov    %r13,%rbp
     0x0000555555555557 &lt;+90&gt;:    mov    0x0(%r13),%eax
     0x000055555555555b &lt;+94&gt;:    sub    $0x1,%eax
     0x000055555555555e &lt;+97&gt;:    cmp    $0x5,%eax
     0x0000555555555561 &lt;+100&gt;:   ja     0x55555555552f &lt;phase_6+50&gt;
     0x0000555555555563 &lt;+102&gt;:   add    $0x1,%r14d
     0x0000555555555567 &lt;+106&gt;:   cmp    $0x6,%r14d
     0x000055555555556b &lt;+110&gt;:   je     0x555555555572 &lt;phase_6+117&gt;
     0x000055555555556d &lt;+112&gt;:   mov    %r14d,%ebx
     0x0000555555555570 &lt;+115&gt;:   jmp    0x55555555553e &lt;phase_6+65&gt;
     0x0000555555555572 &lt;+117&gt;:   lea    0x18(%r12),%rcx
     0x0000555555555577 &lt;+122&gt;:   mov    $0x7,%edx
     0x000055555555557c &lt;+127&gt;:   mov    %edx,%eax
     0x000055555555557e &lt;+129&gt;:   sub    (%r12),%eax
     0x0000555555555582 &lt;+133&gt;:   mov    %eax,(%r12)
     0x0000555555555586 &lt;+137&gt;:   add    $0x4,%r12
     0x000055555555558a &lt;+141&gt;:   cmp    %r12,%rcx
     0x000055555555558d &lt;+144&gt;:   jne    0x55555555557c &lt;phase_6+127&gt;
     0x000055555555558f &lt;+146&gt;:   mov    $0x0,%esi
     0x0000555555555594 &lt;+151&gt;:   jmp    0x5555555555b0 &lt;phase_6+179&gt;
     0x0000555555555596 &lt;+153&gt;:   mov    0x8(%rdx),%rdx
     0x000055555555559a &lt;+157&gt;:   add    $0x1,%eax
     0x000055555555559d &lt;+160&gt;:   cmp    %ecx,%eax
     0x000055555555559f &lt;+162&gt;:   jne    0x555555555596 &lt;phase_6+153&gt;
     0x00005555555555a1 &lt;+164&gt;:   mov    %rdx,0x20(%rsp,%rsi,8)
     0x00005555555555a6 &lt;+169&gt;:   add    $0x1,%rsi
     0x00005555555555aa &lt;+173&gt;:   cmp    $0x6,%rsi
     0x00005555555555ae &lt;+177&gt;:   je     0x5555555555c6 &lt;phase_6+201&gt;
     0x00005555555555b0 &lt;+179&gt;:   mov    (%rsp,%rsi,4),%ecx
     0x00005555555555b3 &lt;+182&gt;:   mov    $0x1,%eax
     0x00005555555555b8 &lt;+187&gt;:   lea    0x202c71(%rip),%rdx        # 0x555555758230 &lt;node1&gt;
     0x00005555555555bf &lt;+194&gt;:   cmp    $0x1,%ecx
     0x00005555555555c2 &lt;+197&gt;:   jg     0x555555555596 &lt;phase_6+153&gt;
     0x00005555555555c4 &lt;+199&gt;:   jmp    0x5555555555a1 &lt;phase_6+164&gt;
     0x00005555555555c6 &lt;+201&gt;:   mov    0x20(%rsp),%rbx
     0x00005555555555cb &lt;+206&gt;:   mov    0x28(%rsp),%rax
     0x00005555555555d0 &lt;+211&gt;:   mov    %rax,0x8(%rbx)
     0x00005555555555d4 &lt;+215&gt;:   mov    0x30(%rsp),%rdx
     0x00005555555555d9 &lt;+220&gt;:   mov    %rdx,0x8(%rax)
     0x00005555555555dd &lt;+224&gt;:   mov    0x38(%rsp),%rax
     0x00005555555555e2 &lt;+229&gt;:   mov    %rax,0x8(%rdx)
     0x00005555555555e6 &lt;+233&gt;:   mov    0x40(%rsp),%rdx
     0x00005555555555eb &lt;+238&gt;:   mov    %rdx,0x8(%rax)
     0x00005555555555ef &lt;+242&gt;:   mov    0x48(%rsp),%rax
     0x00005555555555f4 &lt;+247&gt;:   mov    %rax,0x8(%rdx)
     0x00005555555555f8 &lt;+251&gt;:   movq   $0x0,0x8(%rax)
     0x0000555555555600 &lt;+259&gt;:   mov    $0x5,%ebp
     0x0000555555555605 &lt;+264&gt;:   jmp    0x555555555610 &lt;phase_6+275&gt;
     // ...To Here
  
  
     //I think this block is compareing $rbx, *($rbx + 8), .... with ($rbx)
     //but gdb says can't read the memory *($rbx + 8), *(*($rbx + 8) + 8), ...things.
     //Only it reads $rbx
     0x0000555555555607 &lt;+266&gt;:   mov    0x8(%rbx),%rbx
     0x000055555555560b &lt;+270&gt;:   sub    $0x1,%ebp
     0x000055555555560e &lt;+273&gt;:   je     0x555555555621 &lt;phase_6+292&gt;
     0x0000555555555610 &lt;+275&gt;:   mov    0x8(%rbx),%rax
     0x0000555555555614 &lt;+279&gt;:   mov    (%rax),%eax
     0x0000555555555616 &lt;+281&gt;:   cmp    %eax,(%rbx)
     0x0000555555555618 &lt;+283&gt;:   jge    0x555555555607 &lt;phase_6+266&gt;
     0x000055555555561a &lt;+285&gt;:   callq  0x555555555a7e &lt;explode_bomb&gt;
     0x000055555555561f &lt;+290&gt;:   jmp    0x555555555607 &lt;phase_6+266&gt;
  
  
  
     0x0000555555555621 &lt;+292&gt;:   mov    0x58(%rsp),%rax
     0x0000555555555626 &lt;+297&gt;:   xor    %fs:0x28,%rax
     0x000055555555562f &lt;+306&gt;:   jne    0x55555555563e &lt;phase_6+321&gt;
     0x0000555555555631 &lt;+308&gt;:   add    $0x60,%rsp
     0x0000555555555635 &lt;+312&gt;:   pop    %rbx
     0x0000555555555636 &lt;+313&gt;:   pop    %rbp
     0x0000555555555637 &lt;+314&gt;:   pop    %r12
     0x0000555555555639 &lt;+316&gt;:   pop    %r13
     0x000055555555563b &lt;+318&gt;:   pop    %r14
     0x000055555555563d &lt;+320&gt;:   retq   
     0x000055555555563e &lt;+321&gt;:   callq  0x555555554e90 &lt;__stack_chk_fail@plt&gt;
  End of assembler dump.
  </code></pre>
  
  <p>I also tried <code>until *0x0000555555555618</code> and <code>ni</code> for recognize the process flow, but... no idea what is the rule...</p>