菜鸟组装炸弹破坏 cmp 操作员
Rookie Assembly Bomb Defusal cmp Operator
我是装配新手,真的不知道发生了什么。
我正在尝试完成一项家庭作业,其中我们必须通过找出程序五个阶段的正确输入来拆除炸弹。
我试过在网上寻找我的问题的答案,但我真的不知道要搜索什么才能找到我正在寻找的答案。
我相信我理解下面代码中从 <+0>
到 <+35>
的所有内容。在 <+40>
处调用 cmp 运算符来比较 [=14=]x2
和存储在 %eax
寄存器中的内容。在进行比较时,我相信 %eax
仍在存储对 scanf 的函数调用(如果我错了请纠正我)。
通过使用 gdb 我知道 scanf 函数被调用如下:
scanf("%d %d", &x, &y);
那么 [=14=]x2
在这种情况下到底指的是什么(它只是值 2 吗?)以及比较这两项时发生了什么?
我相信这是 GAS 语法。
0x0804870a <+0>: sub [=10=]x2c,%esp
0x0804870d <+3>: lea 0x1c(%esp),%eax
0x08048711 <+7>: mov %eax,0xc(%esp)
0x08048715 <+11>: lea 0x18(%esp),%eax
0x08048719 <+15>: mov %eax,0x8(%esp)
0x0804871d <+19>: movl [=10=]x8048baa,0x4(%esp)
0x08048725 <+27>: mov 0x804b040,%eax
0x0804872a <+32>: mov %eax,(%esp)
0x0804872d <+35>: call 0x8048480 <__isoc99_fscanf@plt>
0x08048732 <+40>: cmp [=10=]x2,%eax
0x08048735 <+43>: je 0x8048743 <phase_1_of_5+57>
0x08048737 <+45>: movl [=10=]x1,(%esp)
0x0804873e <+52>: call 0x80486ef <explode>
0x08048743 <+57>: mov 0x18(%esp),%eax
0x08048747 <+61>: mov %eax,%edx
0x08048749 <+63>: shl [=10=]x5,%edx
0x0804874c <+66>: add %edx,%eax
0x0804874e <+68>: cmp 0x1c(%esp),%eax
0x08048752 <+72>: je 0x8048760 <phase_1_of_5+86>
0x08048754 <+74>: movl [=10=]x1,(%esp)
0x0804875b <+81>: call 0x80486ef <explode>
0x08048760 <+86>: add [=10=]x2c,%esp
0x08048763 <+89>: ret
与 JE 和相关指令的常见混淆。我建议使用调试器来可视化代码在做什么。
cmp 正在内部减法,但实际上是在检查 eax == 2。如果 eax == 2 JE(JUMP IF EQUAL),它会跳转,因此 EIP 寄存器(执行的下一条指令)变为 0x08048743([= 的内存地址26=]).如果 eax != 2,它越过 JE 忽略它。
在你自己练习并再次陷入困境之前,请勿阅读本文:
所以我们看http://www.tutorialspoint.com/c_standard_library/c_function_fscanf.htm。 fscanf 做什么。我们看到 return 值为 2 意味着它需要 2 个输入项。现在我们假设我们输入两个术语,现在我们遵循 JE。
我们看到了(这就是为什么你需要一个调试器来可视化它)
mov 0x18(%esp),%eax
...
cmp 0x1c(%esp),%eax
0x18 == 6th value on the stack
0x1c == 7th value on the stack
safe to assume these are the two input terms.
0x08048743 <+57>: mov 0x18(%esp),%eax
0x08048747 <+61>: mov %eax,%edx
0x08048749 <+63>: shl [=10=]x5,%edx
0x0804874c <+66>: add %edx,%eax
这里我们可以假设拆弹的方法是将第一项左移5,加到第一项上。到第二学期。
所以 0 0 应该解除它。
我是装配新手,真的不知道发生了什么。
我正在尝试完成一项家庭作业,其中我们必须通过找出程序五个阶段的正确输入来拆除炸弹。
我试过在网上寻找我的问题的答案,但我真的不知道要搜索什么才能找到我正在寻找的答案。
我相信我理解下面代码中从 <+0>
到 <+35>
的所有内容。在 <+40>
处调用 cmp 运算符来比较 [=14=]x2
和存储在 %eax
寄存器中的内容。在进行比较时,我相信 %eax
仍在存储对 scanf 的函数调用(如果我错了请纠正我)。
通过使用 gdb 我知道 scanf 函数被调用如下:
scanf("%d %d", &x, &y);
那么 [=14=]x2
在这种情况下到底指的是什么(它只是值 2 吗?)以及比较这两项时发生了什么?
我相信这是 GAS 语法。
0x0804870a <+0>: sub [=10=]x2c,%esp
0x0804870d <+3>: lea 0x1c(%esp),%eax
0x08048711 <+7>: mov %eax,0xc(%esp)
0x08048715 <+11>: lea 0x18(%esp),%eax
0x08048719 <+15>: mov %eax,0x8(%esp)
0x0804871d <+19>: movl [=10=]x8048baa,0x4(%esp)
0x08048725 <+27>: mov 0x804b040,%eax
0x0804872a <+32>: mov %eax,(%esp)
0x0804872d <+35>: call 0x8048480 <__isoc99_fscanf@plt>
0x08048732 <+40>: cmp [=10=]x2,%eax
0x08048735 <+43>: je 0x8048743 <phase_1_of_5+57>
0x08048737 <+45>: movl [=10=]x1,(%esp)
0x0804873e <+52>: call 0x80486ef <explode>
0x08048743 <+57>: mov 0x18(%esp),%eax
0x08048747 <+61>: mov %eax,%edx
0x08048749 <+63>: shl [=10=]x5,%edx
0x0804874c <+66>: add %edx,%eax
0x0804874e <+68>: cmp 0x1c(%esp),%eax
0x08048752 <+72>: je 0x8048760 <phase_1_of_5+86>
0x08048754 <+74>: movl [=10=]x1,(%esp)
0x0804875b <+81>: call 0x80486ef <explode>
0x08048760 <+86>: add [=10=]x2c,%esp
0x08048763 <+89>: ret
与 JE 和相关指令的常见混淆。我建议使用调试器来可视化代码在做什么。
cmp 正在内部减法,但实际上是在检查 eax == 2。如果 eax == 2 JE(JUMP IF EQUAL),它会跳转,因此 EIP 寄存器(执行的下一条指令)变为 0x08048743([= 的内存地址26=]).如果 eax != 2,它越过 JE 忽略它。
在你自己练习并再次陷入困境之前,请勿阅读本文:
所以我们看http://www.tutorialspoint.com/c_standard_library/c_function_fscanf.htm。 fscanf 做什么。我们看到 return 值为 2 意味着它需要 2 个输入项。现在我们假设我们输入两个术语,现在我们遵循 JE。
我们看到了(这就是为什么你需要一个调试器来可视化它)
mov 0x18(%esp),%eax
...
cmp 0x1c(%esp),%eax
0x18 == 6th value on the stack
0x1c == 7th value on the stack
safe to assume these are the two input terms.
0x08048743 <+57>: mov 0x18(%esp),%eax
0x08048747 <+61>: mov %eax,%edx
0x08048749 <+63>: shl [=10=]x5,%edx
0x0804874c <+66>: add %edx,%eax
这里我们可以假设拆弹的方法是将第一项左移5,加到第一项上。到第二学期。
所以 0 0 应该解除它。