首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >试图拆解

试图拆解
EN

Stack Overflow用户
提问于 2015-02-07 22:36:41
回答 2查看 525关注 0票数 0

任务是解释一些组装代码,以找到一个短语,不用调用“爆炸炸弹”就能运行。我用gdb来分解当前阶段。我被困住了,任何关于我是否朝着正确的方向前进的建议都将是非常感谢的。

代码语言:javascript
运行
复制
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),我认为这使它成为三个整数和其他东西,但我不确定是什么。

代码语言:javascript
运行
复制
0x0000000000400fc8 <+19>:   mov    $0x4028f6,%esi           

地址$0x4028f6的值为“%d %c %d”。我知道它被移动到注册%esi,但我不知道它是如何使用的。

代码语言:javascript
运行
复制
0x0000000000400fcd <+24>:   mov    $0x0,%eax            
0x0000000000400fd2 <+29>:   callq  0x400c80 <__isoc99_sscanf@plt>

不知道这里发生了什么。我查看了0x400c80并发现了以下内容:

代码语言:javascript
运行
复制
0x0000000000400c80 <+0>:    jmpq   *0x20340a(%rip)          
0x0000000000400c86 <+6>:    pushq  $0x12
0x0000000000400c8b <+11>:   jmpq   0x400b50

我看不出%rip被用作寄存器,所以我不太清楚该做什么或在哪里查找。我认为它在%eax中放置了0x12,但是我不知道它在哪里跳,因为0x400b50不是一个有效的地址。无论如何,回到原来的功能:

代码语言:javascript
运行
复制
0x0000000000400fd7 <+34>:   cmp    $0x2,%eax            
0x0000000000400fda <+37>:   jg     0x400fe1 <phase_3+44>
0x0000000000400fdc <+39>:   callq  0x401719 <explode_bomb>

我认为我们刚刚在%eax上推动了0x18,所以它肯定会大于0x2,程序将跳过“爆炸炸弹”。我只想知道在那之前我在哪里搞砸了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-07 23:07:58

不幸的是,你似乎错过了关键的知识。您应该重新检查您可能拥有的任何材料,否则您将不会有太多的运气,其余的作业,实际上将涉及一些较不平凡的代码。

尽管如此,到目前为止,您引用的区块只做了以下几点:

代码语言:javascript
运行
复制
int x, y;
char c;
if (sscanf(foo, "%d %c %d", &x, &c, &y) <= 2) explode_bomb();

第一个块分配3个局部变量,并将每个局部变量的地址加载到相应的sscanf参数的适当寄存器中。注意,x86-64调用约定对前六个参数使用寄存器rdirsircxrdxr8r9 (假设它们是适当的),并且在rax中返回值。

您不需要查看0x400c80,您只需要找到最终跳转到sscanf本身的PLT条目。我们已经知道它是来自符号名的sscanf

票数 0
EN

Stack Overflow用户

发布于 2015-02-07 23:22:20

如果你自己想办法的话,这会更有趣,所以我会给你一些提示

  • 当输入函数时,从堆栈指针中减去是为局部变量分配空间的一种相当标准的方法。
  • 谷歌的英特尔操作系统,例如,"lea“是类似于”加载有效地址“。它不加载数据。
  • 它是一个丑闻C库函数,有一个C99 C语言标准。它从字符串中读取数据,并接受数据字符串、带有%转义转换说明符的格式字符串以及指向放置扫描和转换数据的变量的指针。不需要跟踪sscanf的内部,但是要查找它的返回值。
  • C函数通常在%eax中返回它们的结果。%eax在调用之前被清除,在调用后进行测试,并且根据结果有条件地避免(或不)炸弹。

这应该能给你足够的答案。玩得开心!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28388284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档