任务是解释一些组装代码,以找到一个短语,不用调用“爆炸炸弹”就能运行。我用gdb来分解当前阶段。我被困住了,任何关于我是否朝着正确的方向前进的建议都将是非常感谢的。
0x0000000000400fb5 <+0>: sub $0x18,%rsp
0x0000000000400fb9 <+4>: lea 0x8(%rsp),%r8
0x0000000000400fbe <+9>: lea 0xf(%rsp),%rcx
0x0000000000400fc3 <+14>: lea 0x4(%rsp),%rdx
我认为正在发生的事情是,我们正在查看%rsp中的短语(基本指针所指向的内容)。我认为这是内存中保存的四种东西,at (%rsp)、0x4(%rsp)、0x8(%rsp)和0xf(%rsp),我认为这使它成为三个整数和其他东西,但我不确定是什么。
0x0000000000400fc8 <+19>: mov $0x4028f6,%esi
地址$0x4028f6的值为“%d %c %d”。我知道它被移动到注册%esi,但我不知道它是如何使用的。
0x0000000000400fcd <+24>: mov $0x0,%eax
0x0000000000400fd2 <+29>: callq 0x400c80 <__isoc99_sscanf@plt>
不知道这里发生了什么。我查看了0x400c80并发现了以下内容:
0x0000000000400c80 <+0>: jmpq *0x20340a(%rip)
0x0000000000400c86 <+6>: pushq $0x12
0x0000000000400c8b <+11>: jmpq 0x400b50
我看不出%rip被用作寄存器,所以我不太清楚该做什么或在哪里查找。我认为它在%eax中放置了0x12,但是我不知道它在哪里跳,因为0x400b50不是一个有效的地址。无论如何,回到原来的功能:
0x0000000000400fd7 <+34>: cmp $0x2,%eax
0x0000000000400fda <+37>: jg 0x400fe1 <phase_3+44>
0x0000000000400fdc <+39>: callq 0x401719 <explode_bomb>
我认为我们刚刚在%eax上推动了0x18,所以它肯定会大于0x2,程序将跳过“爆炸炸弹”。我只想知道在那之前我在哪里搞砸了。
发布于 2015-02-07 23:07:58
不幸的是,你似乎错过了关键的知识。您应该重新检查您可能拥有的任何材料,否则您将不会有太多的运气,其余的作业,实际上将涉及一些较不平凡的代码。
尽管如此,到目前为止,您引用的区块只做了以下几点:
int x, y;
char c;
if (sscanf(foo, "%d %c %d", &x, &c, &y) <= 2) explode_bomb();
第一个块分配3个局部变量,并将每个局部变量的地址加载到相应的sscanf
参数的适当寄存器中。注意,x86-64调用约定对前六个参数使用寄存器rdi
、rsi
、rcx
、rdx
、r8
和r9
(假设它们是适当的),并且在rax
中返回值。
您不需要查看0x400c80
,您只需要找到最终跳转到sscanf
本身的PLT条目。我们已经知道它是来自符号名的sscanf
。
发布于 2015-02-07 23:22:20
如果你自己想办法的话,这会更有趣,所以我会给你一些提示
这应该能给你足够的答案。玩得开心!
https://stackoverflow.com/questions/28388284
复制相似问题