2016-10-22 4 views
-1

내 바이너리 폭탄의 phase_4 암호에 문제가 있습니다.폭탄 실험실 단계 4 func4

지금까지 제가 입력 2의 정수 (라인 29)

및 2 정수 정상적으로 < =거나 같고 2 2 그로부터 감산보다 (라인 38-44이어야 ... 이해). 어떤 숫자가되어야 함을 의미합니다. 2-4

그런 다음 func4를 호출하고 func4의 결과를 rsp (이는 테스트를 수행하고 rsp는 항상 0)와 비교하여 그 번호를 찾아야합니다. func4에 입력되면 0을 반환합니다.

func4의 결과가 0 일 필요가있는 경우 입력이 0이어야 함을 의미합니다. phase_4에서 38 번째 줄을 입력하면 내 입력에서 2를 빼기 때문에 두 번째 #가되어야합니다. 2 ...? 그러나 나는 그것을 시험해 보았고 그것은 첫 번째 비교를 만족시키지 못하기 때문에 46 번째 줄에서 폭발하게 만든다.

저는 (0 2) (2 0) (0 1) (0 3)과 같은 숫자를 시도했지만 모두 실패했습니다. 올바른 방향으로 나를 가르키려고 어떤 제안? 감사!

phase_4: 
    0x000000000040101e <+0>: sub $0x18,%rsp 
    0x0000000000401022 <+4>: lea 0xc(%rsp),%rcx 
    0x0000000000401027 <+9>: lea 0x8(%rsp),%rdx 
    0x000000000040102c <+14>: mov $0x4027cd,%esi 
    0x0000000000401031 <+19>: mov $0x0,%eax 
    0x0000000000401036 <+24>: callq 0x400c30 <[email protected]> 
    0x000000000040103b <+29>: cmp $0x2,%eax  //check if 2 inputs 
    0x000000000040103e <+32>: jne 0x40104c <phase_4+46> 
    0x0000000000401040 <+34>: mov 0xc(%rsp),%eax 
=> 0x0000000000401044 <+38>: sub $0x2,%eax   
    0x0000000000401047 <+41>: cmp $0x2,%eax 
    0x000000000040104a <+44>: jbe 0x401051 <phase_4+51>//if unsigned eax <= 2 
    0x000000000040104c <+46>: callq 0x401554 <explode_bomb> 
    0x0000000000401051 <+51>: mov 0xc(%rsp),%esi 
    0x0000000000401055 <+55>: mov $0x7,%edi  
    0x000000000040105a <+60>: callq 0x400fe6 <func4> 
    0x000000000040105f <+65>: cmp 0x8(%rsp),%eax //comparing eax to 0 
    0x0000000000401063 <+69>: je  0x40106a <phase_4+76> 
    0x0000000000401065 <+71>: callq 0x401554 <explode_bomb> //explode if output != 0 
    0x000000000040106a <+76>: add $0x18,%rsp 
    0x000000000040106e <+80>: retq 

Func4 
    0x0000000000400fe6 <+0>: push %r12 
    0x0000000000400fe8 <+2>: push %rbp 
    0x0000000000400fe9 <+3>: push %rbx 
    0x0000000000400fea <+4>: mov %edi,%ebx 
    0x0000000000400fec <+6>: test %edi,%edi 
    0x0000000000400fee <+8>: jle 0x401014 <func4+46> //if input <= 0 
    0x0000000000400ff0 <+10>: mov %esi,%ebp 
    0x0000000000400ff2 <+12>: mov %esi,%eax 
    0x0000000000400ff4 <+14>: cmp $0x1,%edi 
    0x0000000000400ff7 <+17>: je  0x401019 <func4+51> 
    0x0000000000400ff9 <+19>: lea -0x1(%rdi),%edi 
    0x0000000000400ffc <+22>: callq 0x400fe6 <func4> 
    0x0000000000401001 <+27>: lea (%rax,%rbp,1),%r12d 
    0x0000000000401005 <+31>: lea -0x2(%rbx),%edi 
    0x0000000000401008 <+34>: mov %ebp,%esi 
    0x000000000040100a <+36>: callq 0x400fe6 <func4> 
    0x000000000040100f <+41>: add %r12d,%eax 
    0x0000000000401012 <+44>: jmp 0x401019 <func4+51> 
    0x0000000000401014 <+46>: mov $0x0,%eax //make return val 0 
    0x0000000000401019 <+51>: pop %rbx 
    0x000000000040101a <+52>: pop %rbp 
    0x000000000040101b <+53>: pop %r12 
    0x000000000040101d <+55>: retq 
+0

이진 폭탄이 무엇인지 설명하고 해결 방법에 대한 접근 방식과 왜 작동하지 않는지에 대해 설명하십시오. – Qix

+0

[Binary Bomb - Phase 4]의 가능한 복제본 (http://stackoverflow.com/questions/19640148/binary-bomb-phase-4) –

+0

@BoPersson 위상 4는 유사하지만 func 4는 다릅니다. 내 경우 func4 재귀 피보나치 함수를 믿습니다. 그리고 나는 두 번째 입력이> = 2이어야 함을 알고 있습니다. – helloworld

답변

1

다음에, func4를 호출하고 (나는 몇 가지 테스트를 해봤 RSP는 항상 0이다 ) RSP에 func4의 출력을 비교 그래서 나는를 찾을 필요 숫자 은 func4에 입력 될 때 0을 반환합니다.

올바르지 않습니다. func4의 출력은 [rsp + 8]과 비교되며 첫 번째 숫자가 저장됩니다.

(a, b)으로 원하는 입력을 쓰면 a = func4 (7, b)2 <= b <= 4이됩니다.

이제 func4 (x, y)이 무엇인지 파악해야합니다. 힌트 : y과 피보나치 시리즈의 값에 따라 달라지며 인덱스는 x에 달려 있습니다.

func4을 이해하려면 C로 변환하는 것이 좋습니다. 내 대답은이 question의 예시를 참조하십시오. C로 변환했다면 정확하게 phase_4을 이해했을 것입니다.

+0

감사합니다. 어제 알아 냈습니다. 나는 "i r rsp"를하고 있었는데 자동적으로 추가를했다고 생각했지만 그렇지 않았다. func4의 출력을 내가 입력 한 첫 번째 정수와 비교하는 것으로 나타났습니다. 당신의 도움을 주셔서 감사합니다! – helloworld