Предыстория: я выполняю задание «бинарная бомба», в котором я должен пройти 6 различных фаз, чтобы «обезвредить» бомбу. Я могу использовать отладчик, чтобы отслеживать значения и проходить каждую строку сборки. Я застрял на втором этапе.
Цель: найти «пароль» для этого этапа, который удовлетворяет следующей программе. Правильный пароль переведет меня на следующий этап
Думаю, что знаю: похоже, сразу пытается прочитать 6 цифр. Когда я разобрал функцию main () всей бомбы, я заметил строку a с "% d% d% d% d% d% d", поэтому на этой фазе должно быть 6 чисел. Кроме того, похоже, что есть цикл, начинающийся с 1 и заканчивающийся после того, как счетчик больше 5. Кажется, он отслеживается в части памяти -0x4 (% rbp). Похоже на строку, она сравнивает то, что отслеживается в% eax, с тем, что вводит пользователь (ранее сохраненное в% edx в строке, чтобы увидеть, равны ли они. Если они не равны, то бомба взорвется. Если они есть, это будет продолжаться через цикл.
0x400ec9 <phase_2>: push %rbp
0x400eca <phase_2+1>: mov %rsp,%rbp
0x400ecd <phase_2+4>: sub $0x30,%rsp
0x400ed1 <phase_2+8>: mov %rdi,-0x28(%rbp)
0x400ed5 <phase_2+12>: lea -0x20(%rbp),%rsi
0x400ed9 <phase_2+16>: mov -0x28(%rbp),%rdi
0x400edd <phase_2+20>: callq 0x4013e9 <read_six_numbers>
0x400ee2 <phase_2+25>: mov -0x20(%rbp),%eax
0x400ee5 <phase_2+28>: test %eax,%eax
0x400ee7 <phase_2+30>: jns 0x400eee <phase_2+37>
0x400ee9 <phase_2+32>: callq 0x401983 <explode_bomb>
0x400eee <phase_2+37>: movl $0x1,-0x4(%rbp)
0x400ef5 <phase_2+44>: jmp 0x400f1f <phase_2+86>
0x400ef7 <phase_2+46>: mov -0x4(%rbp),%eax
0x400efa <phase_2+49>: cltq
0x400efc <phase_2+51>: mov -0x20(%rbp,%rax,4),%edx
0x400f00 <phase_2+55>: mov -0x4(%rbp),%eax
0x400f03 <phase_2+58>: sub $0x1,%eax
0x400f06 <phase_2+61>: cltq
0x400f08 <phase_2+63>: mov -0x20(%rbp,%rax,4),%eax
0x400f0c <phase_2+67>: add -0x4(%rbp),%eax
0x400f0f <phase_2+70>: add $0x1,%eax
0x400f12 <phase_2+73>: cmp %eax,%edx
0x400f14 <phase_2+75>: je 0x400f1b <phase_2+82>
0x400f16 <phase_2+77>: callq 0x401983 <explode_bomb>
0x400f1b <phase_2+82>: addl $0x1,-0x4(%rbp)
0x400f1f <phase_2+86>: cmpl $0x5,-0x4(%rbp)
0x400f23 <phase_2+90>: jle 0x400ef7 <phase_2+46>
0x400f25 <phase_2+92>: leaveq
0x400f26 <phase_2+93>: retq
Чего я не знаю: здесь есть некоторые новые инструкции, с которыми я не знаком. 'cltq', по-видимому, выполняет «знак-расширение% eax до% rax», но я не совсем уверен, что это означает в данном случае. Кроме того, я не понимаю строку "mov -0x20 (% rbp,% rax, 4),% edx" и что именно она делает. Я понимаю, что он перемещает то, что хранится в 0x20, в регистр% rdx, но я не знаю, что должно быть в этом месте в памяти в то время. Я знаю, что при отладке% rbp at -0x20 содержит одно из 6 введенных мной значений. Но я не совсем уверен, что именно делают% rax и 4.
Если кто-то может увидеть, какие 6 цифр требуются, ОТЛИЧНО! Если нет, я надеюсь, что кто-то сможет хотя бы пролить свет на этот код и проблемы, которые у меня возникают, чтобы помочь мне двигаться в правильном направлении! Спасибо
Некоторые неверные решения, которые я тестировал: 1 2 3 4 5 6; 10 20 30 40 50 60
(Я не хотел продолжать попытки, потому что каждый раз, когда я взрываю бомбу, я снимаю оценку за задание)
-0x20(%rbp, %rax, 4)
. В основном это эквивалентно доступу к массиву, где каждый член имеет 4 байта (отсюда 4), а%rax
- это индекс массива, а%rbp
- адрес. Я не уверен, что делает-0x20
, но предполагаю, что это какое-то смещение, которое просто добавляется к окончательному адресу ... - person nonsensickle   schedule 16.04.2015