2015-10-28 5 views
-2

У меня возникла проблема с этой фазой в лаборатории бинарных бомб. До сих пор я считаю, что ответ должен быть строкой менее 29 символов (как видно на +24) и что мне нужно как-то увеличить% ebx до 5, прежде чем разрешить его обезвредить.
Мой вопрос в том, как я знаю, где искать ответ и каковы шаги, необходимые для его получения?Как решить эту бинарную бомбу?

0x00000000004010f6 <+0>: push %r13 
    0x00000000004010f8 <+2>: push %r12 
    0x00000000004010fa <+4>: push %rbp 
    0x00000000004010fb <+5>: push %rbx 
    0x00000000004010fc <+6>: sub $0x8,%rsp 
    0x0000000000401100 <+10>: mov %rdi,%r13 
    0x0000000000401103 <+13>: callq 0x4012b1 <string_length> //x/s showed that 0x4012b1 was "\200?" 
    0x0000000000401108 <+18>: mov %eax,%r12d //r12d = length of input 
    0x000000000040110b <+21>: lea -0x1(%rax),%eax 
    0x000000000040110e <+24>: cmp $0x1d,%eax //refrains from lengths > 30 
    0x0000000000401111 <+27>: jbe 0x401118 <phase_6+34> 
    0x0000000000401113 <+29>: callq 0x40152f <detonate_bomb> 
    0x0000000000401118 <+34>: test %r12d,%r12d 
    0x000000000040111b <+37>: jle 0x40113d <phase_6+71> 
    0x000000000040111d <+39>: mov $0x0,%ebx 
    0x0000000000401122 <+44>: movzbl 0x0(%r13,%rbx,1),%eax 
    0x0000000000401128 <+50>: sub $0x30,%eax 
    0x000000000040112b <+53>: cmp $0x1,%al //last 4 bits < 1 
    0x000000000040112d <+55>: jbe 0x401134 <phase_6+62> 
=> 0x000000000040112f <+57>: callq 0x40152f <detonate_bomb> 
    0x0000000000401134 <+62>: add $0x1,%rbx/
    0x0000000000401138 <+66>: cmp %ebx,%r12d 
    0x000000000040113b <+69>: jg  0x401122 <phase_6+44> 
    0x000000000040113d <+71>: mov $0x0,%ebx //start of a a double for loop? 
    0x0000000000401142 <+76>: mov $0x0,%ebp 
    0x0000000000401147 <+81>: mov $0x604300,%eax //(gdb)x 0x604300 <tnode13>: "" 
    0x000000000040114c <+86>: movzbl (%rax),%edx 
    0x000000000040114f <+89>: test %dl,%dl 
    0x0000000000401151 <+91>: je  0x40116d <phase_6+119> 
    0x0000000000401153 <+93>: movslq %ebx,%rax 
    0x0000000000401156 <+96>: cmp 0x402506(%rax),%dl // x 0x402506 = "eaeafc" 
    0x000000000040115c <+102>: je  0x401163 <phase_6+109> 
    0x000000000040115e <+104>: callq 0x40152f <detonate_bomb> 
    0x0000000000401163 <+109>: add $0x1,%ebx //incrementing counter 
    0x0000000000401166 <+112>: mov $0x604300,%eax 
    0x000000000040116b <+117>: jmp 0x40118d <phase_6+151> 
    0x000000000040116d <+119>: movslq %ebp,%rdx //%rdx = 0 
    0x0000000000401170 <+122>: movzbl 0x0(%r13,%rdx,1),%edx 
    0x0000000000401176 <+128>: cmp $0x30,%dl 
    0x0000000000401179 <+131>: jne 0x401181 <phase_6+139> 
    0x000000000040117b <+133>: mov 0x8(%rax),%rax 
    0x000000000040117f <+137>: jmp 0x40118a <phase_6+148> 
    0x0000000000401181 <+139>: cmp $0x31,%dl 
    0x0000000000401184 <+142>: jne 0x40118a <phase_6+148> 
    0x0000000000401186 <+144>: mov 0x10(%rax),%rax 
    0x000000000040118a <+148>: add $0x1,%ebp //increment %ebp 
    0x000000000040118d <+151>: cmp $0x5,%ebx 
    0x0000000000401190 <+154>: jg  0x401197 <phase_6+161> 
    0x0000000000401192 <+156>: cmp %r12d,%ebp //comparing 
    0x0000000000401195 <+159>: jl  0x40114c <phase_6+86> 
    0x0000000000401197 <+161>: cmp $0x5,%ebx 
    0x000000000040119a <+164>: jne 0x4011a2 <phase_6+172> 
    0x000000000040119c <+166>: cmpb $0x63,(%rax) 
    0x000000000040119f <+169>: nop 
    0x00000000004011a0 <+170>: je  0x4011a7 <phase_6+177> //if %rax == 99 jump 
    0x00000000004011a2 <+172>: callq 0x40152f <detonate_bomb> 
    0x00000000004011a7 <+177>: add $0x8,%rsp 
    0x00000000004011ab <+181>: pop %rbx 
    0x00000000004011ac <+182>: pop %rbp 
    0x00000000004011ad <+183>: pop %r12 
    0x00000000004011af <+185>: pop %r13 
    0x00000000004011b1 <+187>: retq 
+3

Возьмите его в отряд бомбы. – WedaPashi

+3

Добавьте комментарии к коду или заметки где-нибудь со всем, что вы догадались до сих пор о том, что делает эта функция, и о том, какие ограничения помещаются на входе. Проблема с бинарной бомбой была любопытной в первый раз, но, начиная с нуля, каждый вопрос о бомбе на SO быстро стареет. Для других намного легче увидеть, насколько эти комментарии выглядят разумно, чем решить проблему с нуля. –

+1

Кроме того, дизассемблер, такой как «objconv» Agner Fog, будет размещать метки-метки-метки в выходном коде, что упростит поиск объектов ветвей. (И он разбирается в синтаксисе NASM, а не в менее популярном AT & T.) –

ответ

2

код делает jbe после сравнения с 29, так что условие действительно, что длина строки должна быть меньше или равна до 29

Я не вижу ничего, что делает меня думаю, ebx = 5 поможет. Это индекс массива для загрузки из строки. Вероятно, это в цикле, поэтому условие должно быть истинным для всех символов. Я перестал читать код там.

Я настоятельно рекомендую objconv. Я нашел, что это действительно полезно, когда я недавно делал двойную бомбу, так как он сохранил ручную работу с рукопожатием, написанную вручную (или держать в голове, куда идет ветка).

Смежные вопросы