背景:我正在做一个“二元炸弹”任务,我必须通过 6 个不同的阶段来“化解”炸弹。我可以使用调试器来帮助跟踪值并逐步执行程序集的每一行。我被困在第二阶段。
目标:找到满足以下程序的此阶段的“密码”。正确的密码将使我进入下一阶段
我想我知道的:它看起来马上,它正在尝试读取 6 个数字。当我拆解整个炸弹的 main() 函数时,我注意到一行带有 "%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 寄存器,但我不知道当时内存中的那个位置应该是什么。我知道在进行调试时,-0x20 处的 %rbp 包含我输入的 6 个值之一。但我不太确定 %rax 和 4 究竟做了什么。
如果有人能看到所需的 6 个数字是什么,那就太好了!如果没有,我希望有人至少可以阐明这段代码以及我必须帮助推动我朝着正确方向前进的问题!谢谢
我测试的一些错误解决方案:1 2 3 4 5 6;10 20 30 40 50 60
(我不想继续尝试,因为每次我引爆炸弹,我的作业成绩都会得到一分)