【发布时间】:2016-09-05 15:52:40
【问题描述】:
嘿,我正在拆除一个二元炸弹,现在处于第 2 阶段,并试图弄清楚应该如何进行拆除。我已经添加了关于我认为实际发生的事情的 cmets,但如果我错了,请纠正我并帮助我理解这是如何工作的。这是阶段_2:
08048763 <phase_2>:
8048763: 55 push %ebp
8048764: 89 e5 mov %esp,%ebp
8048766: 83 ec 28 sub $0x28,%esp
; read 6 numbers
8048769: 8d 45 dc lea -0x24(%ebp),%eax
804876c: 83 c0 14 add $0x14,%eax
804876f: 50 push %eax
8048770: 8d 45 dc lea -0x24(%ebp),%eax
8048773: 83 c0 10 add $0x10,%eax
8048776: 50 push %eax
8048777: 8d 45 dc lea -0x24(%ebp),%eax
804877a: 83 c0 0c add $0xc,%eax
804877d: 50 push %eax
804877e: 8d 45 dc lea -0x24(%ebp),%eax
8048781: 83 c0 08 add $0x8,%eax
8048784: 50 push %eax
8048785: 8d 45 dc lea -0x24(%ebp),%eax
8048788: 83 c0 04 add $0x4,%eax
804878b: 50 push %eax
804878c: 8d 45 dc lea -0x24(%ebp),%eax
804878f: 50 push %eax
8048790: 68 18 94 04 08 push $0x8049418
8048795: ff 75 08 pushl 0x8(%ebp)
; call scanf()
8048798: e8 53 fd ff ff call 80484f0 <sscanf@plt>
804879d: 83 c4 20 add $0x20,%esp
; check if first number is greater than 5
80487a0: 83 f8 05 cmp $0x5,%eax
80487a3: 7f 05 jg 80487aa <phase_2+0x47>
80487a5: e8 ad fe ff ff call 8048657 <explode>
80487aa: 8b 45 dc mov -0x24(%ebp),%eax
; check if the 2nd number is 9 ; jump if equals
80487ad: 83 f8 09 cmp $0x9,%eax
80487b0: 74 05 je 80487b7 <phase_2+0x54>
80487b2: e8 a0 fe ff ff call 8048657 <explode>
80487b7: c7 45 f4 01 00 00 00 movl $0x1,-0xc(%ebp)
; BEGIN LOOP
80487be: eb 22 jmp 80487e2 <phase_2+0x7f>
80487c0: 8b 45 f4 mov -0xc(%ebp),%eax
80487c3: 8b 54 85 dc mov -0x24(%ebp,%eax,4),%edx
80487c7: 8b 45 f4 mov -0xc(%ebp),%eax
80487ca: 83 e8 01 sub $0x1,%eax
80487cd: 8b 44 85 dc mov -0x24(%ebp,%eax,4),%eax
; what is it that gets multiplied here?
80487d1: 0f af 45 f4 imul -0xc(%ebp),%eax
; compare eax with edx but not clear what happens here. jump when equals
80487d5: 39 c2 cmp %eax,%edx
80487d7: 74 05 je 80487de <phase_2+0x7b>
80487d9: e8 79 fe ff ff call 8048657 <explode>
; we add 1 before comparing with 5?
80487de: 83 45 f4 01 addl $0x1,-0xc(%ebp)
; compare jump next if number <= 5
80487e2: 83 7d f4 05 cmpl $0x5,-0xc(%ebp)
80487e6: 7e d8 jle 80487c0 <phase_2+0x5d>
80487e8: 83 ec 0c sub $0xc,%esp
80487eb: 68 2a 94 04 08 push $0x804942a
80487f0: e8 16 fe ff ff call 804860b <say>
80487f5: 83 c4 10 add $0x10,%esp
80487f8: c9 leave
80487f9: c3 ret
【问题讨论】:
-
eax乘以[ebp-0xC](= 内存地址ebp-0xC的值)并与edx进行比较,如果它们不一样,炸弹就会爆炸。再往下,循环计数器递增,然后与 5 进行比较 - 循环继续,直到递增后的值达到 6(使用jle,因此它基本上检查 C 术语中的++i <= 5是否) -
这已经解决了,没关系。
-
那么请将您的解决方案作为答案发布并接受它,以便其他人也可以从中受益。
标签: assembly x86 gdb reverse-engineering