Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何解决二元bomblab第6阶段的问题?_Assembly_Binary_X86 64_Reverse Engineering - Fatal编程技术网

Assembly 如何解决二元bomblab第6阶段的问题?

Assembly 如何解决二元bomblab第6阶段的问题?,assembly,binary,x86-64,reverse-engineering,Assembly,Binary,X86 64,Reverse Engineering,这是我的phase_6反汇编代码,请帮我解决这个问题。我知道答案应该是1到6之间的数字 0x000055555555553e <+0>: push %r13 0x0000555555555540 <+2>: push %r12 0x0000555555555542 <+4>: push %rbp 0x0000555555555543 <+5>: push %rbx 0x0000555555555

这是我的phase_6反汇编代码,请帮我解决这个问题。我知道答案应该是1到6之间的数字

     0x000055555555553e <+0>:   push   %r13
   0x0000555555555540 <+2>: push   %r12
   0x0000555555555542 <+4>: push   %rbp
   0x0000555555555543 <+5>: push   %rbx
   0x0000555555555544 <+6>: sub    $0x68,%rsp
   0x0000555555555548 <+10>:    mov    %fs:0x28,%rax
   0x0000555555555551 <+19>:    mov    %rax,0x58(%rsp)
   0x0000555555555556 <+24>:    xor    %eax,%eax
   0x0000555555555558 <+26>:    mov    %rsp,%r12
   0x000055555555555b <+29>:    mov    %r12,%rsi
   0x000055555555555e <+32>:    callq  0x5555555558c8 <read_six_numbers>
   0x0000555555555563 <+37>:    mov    $0x0,%r13d
   0x0000555555555569 <+43>:    jmp    0x555555555590 <phase_6+82>
   0x000055555555556b <+45>:    callq  0x5555555558a2 <explode_bomb>
   0x0000555555555570 <+50>:    jmp    0x55555555559f <phase_6+97>
   0x0000555555555572 <+52>:    add    $0x1,%ebx
   0x0000555555555575 <+55>:    cmp    $0x5,%ebx
   0x0000555555555578 <+58>:    jg     0x55555555558c <phase_6+78>
   0x000055555555557a <+60>:    movslq %ebx,%rax
   0x000055555555557d <+63>:    mov    (%rsp,%rax,4),%eax
   0x0000555555555580 <+66>:    cmp    %eax,0x0(%rbp)
   0x0000555555555583 <+69>:    jne    0x555555555572 <phase_6+52>
   0x0000555555555585 <+71>:    callq  0x5555555558a2 <explode_bomb>
   0x000055555555558a <+76>:    jmp    0x555555555572 <phase_6+52>
   0x000055555555558c <+78>:    add    $0x4,%r12
   0x0000555555555590 <+82>:    mov    %r12,%rbp
   0x0000555555555593 <+85>:    mov    (%r12),%eax
--Type <RET> for more, q to quit, c to continue without paging--c
   0x0000555555555597 <+89>:    sub    $0x1,%eax
   0x000055555555559a <+92>:    cmp    $0x5,%eax
   0x000055555555559d <+95>:    ja     0x55555555556b <phase_6+45>
   0x000055555555559f <+97>:    add    $0x1,%r13d
   0x00005555555555a3 <+101>:   cmp    $0x6,%r13d
   0x00005555555555a7 <+105>:   je     0x5555555555de <phase_6+160>
   0x00005555555555a9 <+107>:   mov    %r13d,%ebx
   0x00005555555555ac <+110>:   jmp    0x55555555557a <phase_6+60>
   0x00005555555555ae <+112>:   mov    0x8(%rdx),%rdx
   0x00005555555555b2 <+116>:   add    $0x1,%eax
   0x00005555555555b5 <+119>:   cmp    %ecx,%eax
   0x00005555555555b7 <+121>:   jne    0x5555555555ae <phase_6+112>
   0x00005555555555b9 <+123>:   mov    %rdx,0x20(%rsp,%rsi,8)
   0x00005555555555be <+128>:   add    $0x1,%rsi
   0x00005555555555c2 <+132>:   cmp    $0x6,%rsi
   0x00005555555555c6 <+136>:   je     0x5555555555e5 <phase_6+167>
   0x00005555555555c8 <+138>:   mov    (%rsp,%rsi,4),%ecx
   0x00005555555555cb <+141>:   mov    $0x1,%eax
   0x00005555555555d0 <+146>:   lea    0x202c39(%rip),%rdx        # 0x555555758210 <node1>
   0x00005555555555d7 <+153>:   cmp    $0x1,%ecx
   0x00005555555555da <+156>:   jg     0x5555555555ae <phase_6+112>
   0x00005555555555dc <+158>:   jmp    0x5555555555b9 <phase_6+123>
   0x00005555555555de <+160>:   mov    $0x0,%esi
   0x00005555555555e3 <+165>:   jmp    0x5555555555c8 <phase_6+138>
   0x00005555555555e5 <+167>:   mov    0x20(%rsp),%rbx
   0x00005555555555ea <+172>:   mov    0x28(%rsp),%rax
   0x00005555555555ef <+177>:   mov    %rax,0x8(%rbx)
   0x00005555555555f3 <+181>:   mov    0x30(%rsp),%rdx
   0x00005555555555f8 <+186>:   mov    %rdx,0x8(%rax)
   0x00005555555555fc <+190>:   mov    0x38(%rsp),%rax
   0x0000555555555601 <+195>:   mov    %rax,0x8(%rdx)
   0x0000555555555605 <+199>:   mov    0x40(%rsp),%rdx
   0x000055555555560a <+204>:   mov    %rdx,0x8(%rax)
   0x000055555555560e <+208>:   mov    0x48(%rsp),%rax
   0x0000555555555613 <+213>:   mov    %rax,0x8(%rdx)
   0x0000555555555617 <+217>:   movq   $0x0,0x8(%rax)
   0x000055555555561f <+225>:   mov    $0x5,%ebp
   0x0000555555555624 <+230>:   jmp    0x55555555562f <phase_6+241>
   0x0000555555555626 <+232>:   mov    0x8(%rbx),%rbx
   0x000055555555562a <+236>:   sub    $0x1,%ebp
   0x000055555555562d <+239>:   je     0x555555555640 <phase_6+258>
   0x000055555555562f <+241>:   mov    0x8(%rbx),%rax
   0x0000555555555633 <+245>:   mov    (%rax),%eax
   0x0000555555555635 <+247>:   cmp    %eax,(%rbx)
   0x0000555555555637 <+249>:   jle    0x555555555626 <phase_6+232>
   0x0000555555555639 <+251>:   callq  0x5555555558a2 <explode_bomb>
   0x000055555555563e <+256>:   jmp    0x555555555626 <phase_6+232>
   0x0000555555555640 <+258>:   mov    0x58(%rsp),%rax
   0x0000555555555645 <+263>:   xor    %fs:0x28,%rax
   0x000055555555564e <+272>:   jne    0x55555555565b <phase_6+285>
   0x0000555555555650 <+274>:   add    $0x68,%rsp
   0x0000555555555654 <+278>:   pop    %rbx
   0x0000555555555655 <+279>:   pop    %rbp
   0x0000555555555656 <+280>:   pop    %r12
   0x0000555555555658 <+282>:   pop    %r13
   0x000055555555565a <+284>:   retq   
   0x000055555555565b <+285>:   callq  0x555555554e50 <__stack_chk_fail@plt>
0x0000553E:推送%r13
0x00005540:推送%r12
0x00005542:推送%rbp
0x00005543:推送%rbx
0x00005544:sub$0x68,%rsp
0x00005548:mov%fs:0x28,%rax
0x000055551:mov%rax,0x58(%rsp)
0x000055556:xor%eax,%eax
0x000055558:mov%rsp,%r12
0x00005555B:mov%r12,%rsi
0x00005555E:callq 0x5558C8
0x00005563:mov$0x0,%r13d
0x00005569:jmp 0x5590
0x0000556B:callq 0x5558A2
0x00005570:jmp 0x559F
0x00005572:添加$0x1,%ebx
0x00005575:cmp$0x5,%ebx
0x000055578:jg 0x558C
0x0000557A:movslq%ebx,%rax
0x0000557D:mov(%rsp,%rax,4),%eax
0x00005580:cmp%eax,0x0(%rbp)
0x00005583:jne 0x5572
0x000055585:callq 0x5558A2
0x00005558A:jmp 0x5572
0x0000558C:添加$0x4,%r12
0x00005590:mov%r12,%rbp
0x00005593:mov(%r12),%eax
--键入更多,q退出,c不分页继续--c
0x00005597:sub$0x1,%eax
0x0000559A:cmp$0x5,%eax
0x0000559D:ja 0x556B
0x0000559F:添加$0x1,%r13d
0x0000555A3:cmp$0x6,%r13d
0x0000555A7:je 0x5555DE
0x0000555A9:mov%r13d,%ebx
0x0000555AC:jmp 0x557A
0x0000555AE:mov 0x8(%rdx),%rdx
0x0000555B2:添加$0x1,%eax
0x000055B5:cmp%ecx,%eax
0x0000555B7:jne 0x555555AE
0x0000555B9:mov%rdx,0x20(%rsp,%rsi,8)
0x0000555BE:添加$0x1,%rsi
0x0000555C2:cmp$0x6,%rsi
0x0000555C6:je 0x5555E5
0x0000555C8:mov(%rsp,%rsi,4),%ecx
0x0000555CB:mov$0x1,%eax
0x0000555D0:lea 0x202c39(%rip),%rdx#0x55758210
0x0000555D7:cmp$0x1,%ecx
0x0000555DA:jg 0x5555AE
0x0000555DC:jmp 0x55B9
0x0000555DE:mov$0x0,%esi
0x0000555E3:jmp 0x55C8
0x0000555E5:mov 0x20(%rsp),%rbx
0x0000555EA:mov 0x28(%rsp),%rax
0x0000555EF:mov%rax,0x8(%rbx)
0x0000555F3:mov 0x30(%rsp),%rdx
0x0000555F8:mov%rdx,0x8(%rax)
0x0000555FC:mov 0x38(%rsp),%rax
0x00005555601:mov%rax,0x8(%rdx)
0x00005555605:mov 0x40(%rsp),%rdx
0x0000555560A:mov%rdx,0x8(%rax)
0x0000555560E:mov 0x48(%rsp),%rax
0x00005555613:mov%rax,0x8(%rdx)
0x00005555617:movq$0x0,0x8(%rax)
0x0000555561F:mov$0x5,%ebp
0x00005555624:jmp 0x55562F
0x00005555626:mov 0x8(%rbx),%rbx
0x0000555562A:子$0x1,%ebp
0x0000555562D:je 0x555640
0x0000555562F:mov 0x8(%rbx),%rax
0x00005555633:mov(%rax),%eax
0x00005555635:cmp%eax,(%rbx)
0x00005555637:jle 0x555626
0x00005555639:callq 0x5558A2
0x0000555563E:jmp 0x555626
0x00005555640:mov 0x58(%rsp),%rax
0x00005555645:xor%fs:0x28,%rax
0x0000555564E:jne 0x55565B
0x00005555650:添加$0x68,%rsp
0x00005555654:弹出%rbx
0x00005555655:弹出%rbp
0x00005555656:弹出%r12
0x00005555658:弹出%r13
0x0000555565A:retq
0x0000555565B:callq 0x554E50

我已经工作了好几天了。我解决了第1阶段、第2阶段、第3阶段等等,也就是第6阶段。我知道答案应该是1-6之间的数字。但ı找不到答案。请帮我解决这个问题。

TL;DR-将其转换为C,然后调试或优化它,直到可读为止。 如果您不喜欢C,可以将其转换为流程图,或任何其他支持goto和灵活指针操作的语言

转换为C:

第一步是识别基本代码块;这是一系列指令的运行,这些指令执行时不会分支到或分支出。我喜欢C,所以我将C+p分解到编辑器中,并查找每个跳转指令;类似于
0x00005558A:jmp 0x555572
。我会改为:

0x000055555555558a <+76>:    jmp    0x555555555572 <phase_6+52>
*/
    goto L_572;
L_572:
/*
 0x0000555555555572 <+52>:    add    $0x1,%ebx
0x00005558A:jmp 0x5572
*/
goto L_572;
然后我会找到相应的指令
0x00005572:add$0x1,%ebx
,并将其更改为:

0x000055555555558a <+76>:    jmp    0x555555555572 <phase_6+52>
*/
    goto L_572;
L_572:
/*
 0x0000555555555572 <+52>:    add    $0x1,%ebx
L_572:
/*
0x00005572:添加$0x1,%ebx
一旦你完成了这个,再加上为序言和尾声添加了一些额外的内容,你应该有一个分块的第一个近似值

接下来,细化条件分支周围的区域——一般来说,如果它们向后跳转,它们就是循环;转发它们是if或循环测试

现在开始把代码翻译成更容易理解的东西;像C。 从序言中,找出局部变量是什么:

   void f(long rdi) {
       struct localvars {
             union {
                  long  l[13];
                  int   w[26];
                  /* ... */
             };
       } sp;  /* because the stack pointer points here... */
       sp.l[10] = ((long *)tls())[5];  /* peculiar... */
       /* create some fake C variables for some registers: */
       long  rax, rdx, rsi, rbp, r12, r13, ... ;
       r12 = &sp;
    /*
       0x0000555555555544 <+6>: sub    $0x68,%rsp
       0x0000555555555548 <+10>:    mov    %fs:0x28,%rax
       0x0000555555555551 <+19>:    mov    %rax,0x58(%rsp)
       0x0000555555555556 <+24>:    xor    %eax,%eax
       0x0000555555555558 <+26>:    mov    %rsp,%r12
    */
void f(长rdi){
结构localvars{
联合{
长l[13];
int w[26];
/* ... */
};
}sp;/*因为堆栈指针指向此处*/
sp.l[10]=((长*)tls())[5];/*特殊*/
/*创建som