希望你能帮助我理解如何找出六个数字。尝试了几组我认为是正确的数字,但我猜我没理解它。
所以对于第一个,我正在寻找的这六个数字,不是数字是结果还是数字以适应代码?
我是否必须完成所有代码,或者只有几行我可以找到这些数字?开始认为我过度思考,找到那些数字然后我尝试的方式要容易得多。
08048b74 <phase_2>:
8048b74: 53 push %ebx
8048b75: 83 ec 38 sub $0x38,%esp
8048b78: 8d 44 24 18 lea 0x18(%esp),%eax
8048b7c: 89 44 24 04 mov %eax,0x4(%esp)
8048b80: 8b 44 24 40 mov 0x40(%esp),%eax
8048b84: 89 04 24 mov %eax,(%esp)
8048b87: e8 28 07 00 00 call 80492b4 <read_six_numbers>
8048b8c: 83 7c 24 18 00 cmpl $0x0,0x18(%esp)
8048b91: 79 22 jns 8048bb5 <phase_2+0x41>
8048b93: e8 dd 06 00 00 call 8049275 <explode_bomb>
8048b98: eb 1b jmp 8048bb5 <phase_2+0x41>
8048b9a: 89 d8 mov %ebx,%eax
8048b9c: 03 44 9c 14 add 0x14(%esp,%ebx,4),%eax
8048ba0: 39 44 9c 18 cmp %eax,0x18(%esp,%ebx,4)
8048ba4: 74 05 je 8048bab <phase_2+0x37>
8048ba6: e8 ca 06 00 00 call 8049275 <explode_bomb>
8048bab: 83 c3 01 add $0x1,%ebx
8048bae: 83 fb 06 cmp $0x6,%ebx
8048bb1: 75 e7 jne 8048b9a <phase_2+0x26>
8048bb3: eb 07 jmp 8048bbc <phase_2+0x48>
8048bb5: bb 01 00 00 00 mov $0x1,%ebx
8048bba: eb de jmp 8048b9a <phase_2+0x26>
8048bbc: 83 c4 38 add $0x38,%esp
8048bbf: 5b pop %ebx
8048bc0: c3 ret
答案 0 :(得分:3)
@ user3399655,您只需阅读功能反汇编并了解其功能。当你理解它时,你将需要输入的六个数字是清楚的。
首先,您知道该反汇编中的每条指令的作用吗? (PUSH,SUB,LEA,MOV,CALL,CMP ......)如果没有,请在Intel's Developer Manuals中查找您不知道的内容。你想要手册2A-C。如果您不理解指令的定义,请在此处询问有关它的具体问题。
您了解调用堆栈的概念吗?你知道堆栈中变量的空间是如何分配的,以及如何在汇编中访问它们?如果没有,您将无法理解此功能。
您是否知道像if...else
和for(;;)
这样的C控件结构如何转换为汇编?尝试打印出您发布的反汇编,并绘制箭头,显示每个条件/无条件跳转指令的位置。作为提示,看起来该函数有2个if
块和一个循环。你能看出哪些跳跃是哪种控制结构的一部分?
好的,另一个暗示。 if
块通常转换为条件跳转,如果条件为 false ,则跳转 over 块的内容。如果条件为真,则它不进行跳转,并且进入块的内容。 (这有意义吗?如果需要,可以考虑一下。)如果不满足结束循环的条件,循环转换为向后跳的条件跳转
循环有一个索引变量。你能看到索引变量保存在哪个寄存器中吗?你能告诉它是否上升或下降?在循环终止之前它还能走多远?
你能说出phase_2
的堆叠帧中的6个数字会保留在哪里吗?每个字节使用了多少字节?如果需要,您可以尝试阅读read_six_numbers
的代码。或者只是在调试器中运行代码,然后查看堆栈。
答案 1 :(得分:0)
感谢您给我时间回答我Alex D的一些信息:)很长时间来回答您的回答。
我理解这些指令的大部分内容。我现在知道cmp是我必须注意的重要部分。
我想我对调用堆栈有所了解。
我应该知道如果将其他内容和C中的内容翻译成汇编。
我一直在gdb中观察它是如何通过循环(跳跃)进行的,并且现在已经达到5次跳跃并且停在第6次跳跃,所以我认为我越来越近了。
如果我正在观看gdb,那就认为它是EAX,它随着步进越来越高。
别以为我能说出来。
再次感谢您给予时间回复评论,认为当我的脑袋里的灯亮起时会更容易:)