- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 assembly 新手,真的不知道发生了什么。
我正在尝试完成一项家庭作业,其中我们必须通过找出程序五个阶段的正确输入来拆除炸弹。
我试过在网上寻找我的问题的答案,但我真的不知道要搜索什么才能找到我正在寻找的答案。
我相信我从 <+0>
理解了下面代码中的所有内容至 <+35>
.在 <+40>
调用 cmp 运算符来比较 $0x2
,以及存储在 %eax
中的内容登记。在比较的时候我相信%eax
仍在存储对 scanf 的函数调用(如果我错了请纠正我)。
通过使用 gdb 我知道 scanf 函数被调用如下: scanf("%d %d", &x, &y);
那么$0x2
到底是什么?在这种情况下指的是(它只是值 2 吗?)以及比较这两项时发生了什么?
我相信这是 GAS 语法。
0x0804870a <+0>: sub $0x2c,%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 $0x8048baa,0x4(%esp)
0x08048725 <+27>: mov 0x804b040,%eax
0x0804872a <+32>: mov %eax,(%esp)
0x0804872d <+35>: call 0x8048480 <__isoc99_fscanf@plt>
0x08048732 <+40>: cmp $0x2,%eax
0x08048735 <+43>: je 0x8048743 <phase_1_of_5+57>
0x08048737 <+45>: movl $0x1,(%esp)
0x0804873e <+52>: call 0x80486ef <explode>
0x08048743 <+57>: mov 0x18(%esp),%eax
0x08048747 <+61>: mov %eax,%edx
0x08048749 <+63>: shl $0x5,%edx
0x0804874c <+66>: add %edx,%eax
0x0804874e <+68>: cmp 0x1c(%esp),%eax
0x08048752 <+72>: je 0x8048760 <phase_1_of_5+86>
0x08048754 <+74>: movl $0x1,(%esp)
0x0804875b <+81>: call 0x80486ef <explode>
0x08048760 <+86>: add $0x2c,%esp
0x08048763 <+89>: ret
最佳答案
与 JE 和相关指令的常见混淆。我建议使用调试器来可视化代码的作用。
cmp 正在内部减法,但实际上是在检查 eax == 2。如果 eax == 2 JE (JUMP IF EQUAL),它会跳转,因此 EIP 寄存器(执行的下一条指令)变为 0x08048743(“phase_1_of_5+57 的内存地址” ”)。如果 eax != 2,它会跳过 JE 并忽略它。
在您自己练习并再次陷入困境之前,请勿阅读本文:
所以我们看http://www.tutorialspoint.com/c_standard_library/c_function_fscanf.htm . fscanf 做什么。我们看到返回值为 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 $0x5,%edx
0x0804874c <+66>: add %edx,%eax
这里我们可以假设拆除炸弹的方法是将第一项左移5,加到第一项上。到第二学期。
所以 0 0 应该化解它。
关于c - 菜鸟组装炸弹破坏 cmp 运算符(operator),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35614265/
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
请原谅这个有趣的标题,我用它来比喻“zip bomb”。是否可以创建一个 Scala 源文件,该文件在编译时会生成大量类文件(或非常大的单个类文件)?有什么办法可以让类文件的大小比源文件的大小线性增长
我玩 Unix 有一段时间了,我刚刚发现了一段可爱的代码,每个人都称之为 fork 炸弹::(){ :|:& };:。我想尝试一下,但我知道它会像疯了一样滞后我的计算机,所以我只是想知道是否有人可以给
如果您已经登录系统,如何阻止 fork 炸弹? 最佳答案 斯雷, 如果您在 shell 中仍然拥有“控制权”,则可以尝试使用 ps 和 grep,以及一些 awk,然后是一个循环,以关闭包括父进程在内
可以使用 fork 炸弹(无限 fork )进行拒绝服务攻击。进程表很快就会满,系统就会崩溃。 在线编译器(如编程竞赛)如何处理此类代码。他们有时间限制吗?如果某些程序有几秒的时间限制,它们的进程表将
This question关于 zip 炸弹自然而然地把我带到了 Wikipedia page关于这个话题。文章提到了一个 45.1 kb 的 zip 文件解压缩到 1.3 艾字节的示例。 首先用于创
我正在学习C,遇到了一个小问题。在维基百科和 StackOverflow 上阅读了有关 fork() 炸弹的内容后。我想实现相同的功能,但使用命令行参数。 我想无休止地调用 firefox/chrom
我正在使用 XercesDOMParser 在 linux (c++) 中读取 xml 文件,我想防止 xml 炸弹(Billion 笑)所以我设置了这些属性: parser->setDoNamesp
`#include #include int main(int argc, char **argv){ int pid = 0; int forever; static c
我写了一些这样的代码: std::vector unzip(std::vector const& compressed) { std::vector decompressed; boost
当我有时使用 Apache POI 创建 xlsx 文件时(当文件很大时),它会创建这样一个文件,该文件无法由同一个 Apache POI 打开,而 MS Excel 或 LibreOffice Ca
我使用 Nodejs 应用程序(expressjs、request 等)在网络主机上托管一个网站。 Web 主机有一个 apache 终端,我可以从其中调用 node app.js & 或 forev
代码如下 XmlDocument xdoc = new XmlDocument(); String xml = @"" + "" +
我是一名优秀的程序员,十分优秀!