gpt4 book ai didi

assembly - 二元炸弹 - 第 4 阶段

转载 作者:行者123 更新时间:2023-11-30 17:10:13 25 4
gpt4 key购买 nike

我很难追踪以下二进制炸弹的汇编代码(学校布置的一项作业,其中必须拆除炸弹,该炸弹包含 6 个阶段,所有阶段都有 1 个正确的输入才能进入下一阶段) 。我目前处于 Phase_4,它有一个名为 func4 的递归函数。我已经确定输入是“%d %d”,它是两个整数。但是,即使在每个步骤中获取所有寄存器的信息后,我也无法完全弄清楚 func4 正在做什么。

阶段_4:

    (gdb) disas
Dump of assembler code for function phase_4:
=> 0x08048e24 <+0>: sub $0x2c,%esp
0x08048e27 <+3>: lea 0x1c(%esp),%eax
0x08048e2b <+7>: mov %eax,0xc(%esp)
0x08048e2f <+11>: lea 0x18(%esp),%eax
0x08048e33 <+15>: mov %eax,0x8(%esp)
0x08048e37 <+19>: movl $0x804a7f1,0x4(%esp)
0x08048e3f <+27>: mov 0x30(%esp),%eax
0x08048e43 <+31>: mov %eax,(%esp)
0x08048e46 <+34>: call 0x80488d0 <__isoc99_sscanf@plt>
0x08048e4b <+39>: cmp $0x2,%eax
0x08048e4e <+42>: jne 0x8048e5d <phase_4+57>
0x08048e50 <+44>: mov 0x18(%esp),%eax
0x08048e54 <+48>: test %eax,%eax
0x08048e56 <+50>: js 0x8048e5d <phase_4+57>
0x08048e58 <+52>: cmp $0xe,%eax
0x08048e5b <+55>: jle 0x8048e62 <phase_4+62>
0x08048e5d <+57>: call 0x8049470 <explode_bomb>
0x08048e62 <+62>: movl $0xe,0x8(%esp)
0x08048e6a <+70>: movl $0x0,0x4(%esp)
0x08048e72 <+78>: mov 0x18(%esp),%eax
0x08048e76 <+82>: mov %eax,(%esp)
0x08048e79 <+85>: call 0x8048dbb <func4>
0x08048e7e <+90>: cmp $0x25,%eax
0x08048e81 <+93>: jne 0x8048e8a <phase_4+102>
0x08048e83 <+95>: cmpl $0x25,0x1c(%esp)
0x08048e88 <+100>: je 0x8048e8f <phase_4+107>
0x08048e8a <+102>: call 0x8049470 <explode_bomb>
0x08048e8f <+107>: add $0x2c,%esp
0x08048e92 <+110>: ret
End of assembler dump.

函数4:

Breakpoint 2, 0x08048dbb in func4 ()
(gdb) disas
Dump of assembler code for function func4:
=> 0x08048dbb <+0>: sub $0x1c,%esp
0x08048dbe <+3>: mov %ebx,0x14(%esp)
0x08048dc2 <+7>: mov %esi,0x18(%esp)
0x08048dc6 <+11>: mov 0x20(%esp),%eax
0x08048dca <+15>: mov 0x24(%esp),%edx
0x08048dce <+19>: mov 0x28(%esp),%esi
0x08048dd2 <+23>: mov %esi,%ecx
0x08048dd4 <+25>: sub %edx,%ecx
0x08048dd6 <+27>: mov %ecx,%ebx
0x08048dd8 <+29>: shr $0x1f,%ebx
0x08048ddb <+32>: add %ebx,%ecx
0x08048ddd <+34>: sar %ecx
0x08048ddf <+36>: lea (%ecx,%edx,1),%ebx
0x08048de2 <+39>: cmp %eax,%ebx
0x08048de4 <+41>: jle 0x8048dfd <func4+66>
0x08048de6 <+43>: lea -0x1(%ebx),%ecx
0x08048de9 <+46>: mov %ecx,0x8(%esp)
0x08048ded <+50>: mov %edx,0x4(%esp)
0x08048df1 <+54>: mov %eax,(%esp)
0x08048df4 <+57>: call 0x8048dbb <func4>
0x08048df9 <+62>: add %eax,%ebx
0x08048dfb <+64>: jmp 0x8048e16 <func4+91>
0x08048dfd <+66>: cmp %eax,%ebx
0x08048dff <+68>: jge 0x8048e16 <func4+91>
0x08048e01 <+70>: mov %esi,0x8(%esp)
0x08048e05 <+74>: lea 0x1(%ebx),%edx
0x08048e08 <+77>: mov %edx,0x4(%esp)
0x08048e0c <+81>: mov %eax,(%esp)
0x08048e0f <+84>: call 0x8048dbb <func4>
0x08048e14 <+89>: add %eax,%ebx
0x08048e16 <+91>: mov %ebx,%eax
0x08048e18 <+93>: mov 0x14(%esp),%ebx
0x08048e1c <+97>: mov 0x18(%esp),%esi
0x08048e20 <+101>: add $0x1c,%esp
0x08048e23 <+104>: ret
End of assembler dump.

最佳答案

我希望很明显 phase4正在检查第一个数字是否在 0 范围内..14包括(参见行 +44 .. +57 )然后它调用 func4具有三个参数:输入的第一个数字,014 (行 +62 .. +85 )。接下来它检查返回值是否为 0x25 (十进制 37)在线 +90输入的第二个数字也是 37 (行 +95 )

让我们继续看func4 。我将这三个参数称为 x , lowhigh 。最初您当然不知道它们是什么。线路 +23 ..+34计算(high - low) / 2 。丑陋的困惑是因为编译器生成代码来处理截断为零的负数。但我们不会看到任何负数。专线+36只是一个奇特的补充,所以在 ebx 中我们现在有low + (high - low) / 2这也称为两个数字的平均值。然后,代码将此平均值与数字 x 进行比较这已作为第一个参数提供。线路 +43 ..+62如果 x < average 则执行他们调用 func4(x, low, average - 1)并将返回值添加到平均值中。同样,行 +70 ..+89如果 x > average 则执行并计算average + func4(x, average + 1, high) 。如果x == average然后只返回平均值本身。

它基本上是进行二分搜索并总结猜测。假设区间有 15 个元素,则最多需要 4 次猜测。第一个猜测是 7 ,这样就得到了所需的结果37我们需要30更多的。我们最多还有 3 次尝试,所有猜测要么小于 7,要么大于 7。从 7 * 3 = 21 开始这不能给我们30这意味着数字必须大于 7。因此第二个猜测将是 (8 + 14) / 2 = 11 ,求和1819还有更多的事情要做。如果数字高于 11,则意味着我们超出了目标,因此数字必须大于 7 且小于 11。因此,第三个猜测是 (8 + 10) / 2 = 9总和为 2710还有更多,只是一个猜测,所以这意味着数字是 10 .

TL;DR:正确的输入应该是1037

关于assembly - 二元炸弹 - 第 4 阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32955415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com