这个问题基于与其他Binary Bomb Phase 6问题相同的项目(很可能是相关链接),但出于某种原因,我无法自己找到节点,检查它们的增加/减少值。当我尝试使用函数:x / 3x $ eax时,它返回:无法访问0x4处的内存,这让我觉得它实际上不是一个节点。然而,最终将与检查相等性进行比较。
(gdb) x/3x $eax
0x4: Cannot access memory at address 0x4
这是函数phase_6:
0x08048dea <+0>: push %esi
0x08048deb <+1>: push %ebx
0x08048dec <+2>: sub $0x44,%esp
0x08048def <+5>: lea 0x10(%esp),%eax
0x08048df3 <+9>: mov %eax,0x4(%esp)
0x08048df7 <+13>: mov 0x50(%esp),%eax
0x08048dfb <+17>: mov %eax,(%esp)
0x08048dfe <+20>: call 0x8049479 <read_six_numbers>
0x08048e03 <+25>: mov $0x0,%esi
0x08048e08 <+30>: mov 0x10(%esp,%esi,4),%eax
0x08048e0c <+34>: sub $0x1,%eax
0x08048e0f <+37>: cmp $0x5,%eax
0x08048e12 <+40>: jbe 0x8048e19 <phase_6+47>
0x08048e14 <+42>: call 0x804932c <explode_bomb>
0x08048e19 <+47>: add $0x1,%esi
0x08048e1c <+50>: cmp $0x6,%esi
0x08048e1f <+53>: je 0x8048e54 <phase_6+106>
0x08048e21 <+55>: mov %esi,%ebx
0x08048e23 <+57>: mov 0x10(%esp,%ebx,4),%eax
0x08048e27 <+61>: cmp %eax,0xc(%esp,%esi,4)
0x08048e2b <+65>: jne 0x8048e32 <phase_6+72>
0x08048e2d <+67>: call 0x804932c <explode_bomb>
0x08048e32 <+72>: add $0x1,%ebx
0x08048e35 <+75>: cmp $0x5,%ebx
0x08048e38 <+78>: jle 0x8048e23 <phase_6+57>
0x08048e3a <+80>: jmp 0x8048e08 <phase_6+30>
0x08048e3c <+82>: mov 0x8(%edx),%edx
0x08048e3f <+85>: add $0x1,%eax
0x08048e42 <+88>: cmp %ecx,%eax
0x08048e44 <+90>: jne 0x8048e3c <phase_6+82>
0x08048e46 <+92>: mov %edx,0x28(%esp,%esi,4)
0x08048e4a <+96>: add $0x1,%ebx
0x08048e4d <+99>: cmp $0x6,%ebx
0x08048e50 <+102>: jne 0x8048e59 <phase_6+111>
0x08048e52 <+104>: jmp 0x8048e70 <phase_6+134>
0x08048e54 <+106>: mov $0x0,%ebx
0x08048e59 <+111>: mov %ebx,%esi
0x08048e5b <+113>: mov 0x10(%esp,%ebx,4),%ecx
0x08048e5f <+117>: mov $0x1,%eax
0x08048e64 <+122>: mov $0x804d154,%edx
0x08048e69 <+127>: cmp $0x1,%ecx
0x08048e6c <+130>: jg 0x8048e3c <phase_6+82>
0x08048e6e <+132>: jmp 0x8048e46 <phase_6+92>
0x08048e70 <+134>: mov 0x28(%esp),%ebx
0x08048e74 <+138>: mov 0x2c(%esp),%eax
0x08048e78 <+142>: mov %eax,0x8(%ebx)
0x08048e7b <+145>: mov 0x30(%esp),%edx
0x08048e7f <+149>: mov %edx,0x8(%eax)
0x08048e82 <+152>: mov 0x34(%esp),%eax
0x08048e86 <+156>: mov %eax,0x8(%edx)
0x08048e89 <+159>: mov 0x38(%esp),%edx
0x08048e8d <+163>: mov %edx,0x8(%eax)
0x08048e90 <+166>: mov 0x3c(%esp),%eax
0x08048e94 <+170>: mov %eax,0x8(%edx)
0x08048e97 <+173>: movl $0x0,0x8(%eax)
0x08048e9e <+180>: mov $0x5,%esi
0x08048ea3 <+185>: mov 0x8(%ebx),%eax
* 0x08048ea6 <+188>: mov (%eax),%edx
* 0x08048ea8 <+190>: cmp %edx,(%ebx)
0x08048eaa <+192>: jge 0x8048eb1 <phase_6+199>
0x08048eac <+194>: call 0x804932c <explode_bomb>
0x08048eb1 <+199>: mov 0x8(%ebx),%ebx
0x08048eb4 <+202>: sub $0x1,%esi
0x08048eb7 <+205>: jne 0x8048ea3 <phase_6+185>
0x08048eb9 <+207>: add $0x44,%esp
0x08048ebc <+210>: pop %ebx
0x08048ebd <+211>: pop %esi
0x08048ebe <+212>: ret
在我放星号之前的两行中,我想是比较节点的地方。基本上eax正在与ebx进行比较。但是,当我试图找到eax的节点时,它会给我这个错误。当我尝试在ebx上运行相同的方法时,这就是返回:
(gdb) x/3x $ebx
0xffffd4c4: 0xffffd625 0x00000000 0xffffd651
(gdb) x/3x *($ebx + 8)
0xffffd651: 0x5f474458 0x53534553 0x5f4e4f49
(gdb) x/3x *(*($ebx+8)+8)
0x5f4e4f49: Cannot access memory at address 0x5f4e4f49
这是否意味着ebx不会超过该内存地址?
这就是我所知道的:它接收6个整数,它们都不能等于另一个,它们必须小于或等于6,并且它们必须按降序节点顺序排列。
编辑:
转到带星号的线后,这是我的问题:
(gdb) x/3x *(*(*(*($eax+8)+8)+8)+8)
0x804d154 <node1>: 0x00000395 0x00000001 0x00000000
(gdb) x/3x *(*(*($eax+8)+8)+8)
0x804d160 <node2>: 0x000001e2 0x00000002 0x0804d154
(gdb) x/3x*( *($eax+8)+8)
0x804d16c <node3>: 0x00000328 0x00000003 0x0804d160
(gdb) x/3x*($eax+8)
0x804d178 <node4>: 0x000000d3 0x00000004 0x0804d16c
(gdb) x/3x $eax
0x804d184 <node5>: 0x00000273 0x00000005 0x0804d178
似乎只有5个节点而不是必要的6个节点。
答案 0 :(得分:1)
尝试*(*(*(*($eax+8)+8)+8)+8)
,*(*(*($eax+8)+8)+8)
,*(*($eax+8)+8)
,*($eax+8)
,$eax
,和 $edx
。
> run bomb
---after input 6 int---
---breakpoints phase6, explode_bomb
> until *0x08048ea8
> x/3x *(*(*(*($eax+8)+8)+8)+8)
> x/3x *(*(*($eax+8)+8)+8)
> x/3x *(*($eax+8)+8)
> x/3x *($eax+8)
> x/3x $eax
> x/3x $edx