Assembly 二元炸弹第三阶段卡住了
老实说,我很困惑,因为我的炸弹第三阶段看起来不像我的任何同学或我的教授给我的例子。任何帮助都将不胜感激。我有一份最近的终端供使用,我会把 我已经试了5个小时了,我已经知道%d%d是要求的布局,它要求2个数字,我相信其中一个是负数。由于此处的对比报表和jgAssembly 二元炸弹第三阶段卡住了,assembly,x86,gdb,reverse-engineering,Assembly,X86,Gdb,Reverse Engineering,老实说,我很困惑,因为我的炸弹第三阶段看起来不像我的任何同学或我的教授给我的例子。任何帮助都将不胜感激。我有一份最近的终端供使用,我会把 我已经试了5个小时了,我已经知道%d%d是要求的布局,它要求2个数字,我相信其中一个是负数。由于此处的对比报表和jg 0x08048fbb <+39>: cmp $0x1,%eax 0x08048fbe <+42>: jg 0x8048fc5 <phase_3+49> 0x08048f
0x08048fbb <+39>: cmp $0x1,%eax
0x08048fbe <+42>: jg 0x8048fc5 <phase_3+49>
0x08048fbb:cmp$0x1,%eax
0x08048fbe:jg 0x8048fc5
此外,它还要求对相同的价值进行另一次比较,我认为这是第一次
0x08048fc5 <+49>: cmpl $0x7,-0xc(%ebp)
0x08048fc9 <+53>: ja 0x8049032 <phase_3+158>
0x08048fc5:cmpl$0x7,-0xc(%ebp)
0x08048fc9:ja 0x8049032
让我失望的是所有的加减法,一般来说,所有的加减法都塞进了底部
如果我只是把我看到的数字加起来,我会在哪里找到在endor中实际使用这些语句的值呢。在这一点上,我甚至不知道它是否在盯着我的脸。所有比较如下所示
0x08048fbb <+39>: cmp $0x1,%eax
0x08048fbb:cmp$0x1,%eax
0x08048fbe:jg 0x8048fc5
0x08048fc5 <+49>: cmpl $0x7,-0xc(%ebp)
0x08048fc9 <+53>: ja 0x8049032 <phase_3+158>
0x0804903c <+168>: cmpl $0x5,-0xc(%ebp)
0x08049040 <+172>: jg 0x8049047 <phase_3+179>
0x08048fc5:cmpl$0x7,-0xc(%ebp)
0x08048fc9:ja 0x8049032
0x0804903c:cmpl$0x5,-0xc(%ebp)
0x08049040:jg 0x8049047
但现在一切都很糟,我需要对这个问题有一套新的看法。如果有任何帮助,我们将不胜感激
That's number 2. Keep going!
0 1
Breakpoint 1, 0x08048f9a in phase_3 ()
(gdb) disas
Dump of assembler code for function phase_3:
0x08048f94 <+0>: push %ebp
0x08048f95 <+1>: mov %esp,%ebp
0x08048f97 <+3>: sub $0x28,%esp
=> 0x08048f9a <+6>: lea -0x10(%ebp),%eax
0x08048f9d <+9>: mov %eax,0xc(%esp)
0x08048fa1 <+13>: lea -0xc(%ebp),%eax
0x08048fa4 <+16>: mov %eax,0x8(%esp)
0x08048fa8 <+20>: movl $0x804a58c,0x4(%esp)
0x08048fb0 <+28>: mov 0x8(%ebp),%eax
0x08048fb3 <+31>: mov %eax,(%esp)
0x08048fb6 <+34>: call 0x8048894 <__isoc99_sscanf@plt>
0x08048fbb <+39>: cmp $0x1,%eax
0x08048fbe <+42>: jg 0x8048fc5 <phase_3+49>
0x08048fc0 <+44>: call 0x8049321 <explode_bomb>
0x08048fc5 <+49>: cmpl $0x7,-0xc(%ebp)
0x08048fc9 <+53>: ja 0x8049032 <phase_3+158>
0x08048fcb <+55>: mov -0xc(%ebp),%eax
0x08048fce <+58>: xchg %ax,%ax
0x08048fd0 <+60>: jmp *0x804a4c0(,%eax,4)
0x08048fd7 <+67>: mov $0x0,%eax
0x08048fdc <+72>: lea 0x0(%esi,%eiz,1),%esi
0x08048fe0 <+76>: jmp 0x804902d <phase_3+153>
0x08048fe2 <+78>: mov $0x0,%eax
0x08048fe7 <+83>: jmp 0x804902a <phase_3+150>
0x08048fe9 <+85>: mov $0x0,%eax
0x08048fee <+90>: xchg %ax,%ax
0x08048ff0 <+92>: jmp 0x8049027 <phase_3+147>
0x08048ff2 <+94>: mov $0x0,%eax
0x08048ff7 <+99>: jmp 0x8049024 <phase_3+144>
0x08048ff9 <+101>: mov $0x0,%eax
0x08048ffe <+106>: xchg %ax,%ax
0x08049000 <+108>: jmp 0x8049021 <phase_3+141>
0x08049002 <+110>: mov $0x0,%eax
0x08049007 <+115>: jmp 0x804901c <phase_3+136>
0x08049009 <+117>: mov $0x30d,%eax
0x0804900e <+122>: xchg %ax,%ax
0x08049010 <+124>: jmp 0x8049017 <phase_3+131>
0x08049012 <+126>: mov $0x0,%eax
0x08049017 <+131>: sub $0x264,%eax
0x0804901c <+136>: add $0x3b8,%eax
0x08049021 <+141>: sub $0x49,%eax
0x08049024 <+144>: add $0x49,%eax
0x08049027 <+147>: sub $0x49,%eax
0x0804902a <+150>: add $0x49,%eax
0x0804902d <+153>: sub $0x49,%eax
0x08049030 <+156>: jmp 0x804903c <phase_3+168>
0x08049032 <+158>: call 0x8049321 <explode_bomb>
0x08049037 <+163>: mov $0x0,%eax
0x0804903c <+168>: cmpl $0x5,-0xc(%ebp)
0x08049040 <+172>: jg 0x8049047 <phase_3+179>
0x08049042 <+174>: cmp -0x10(%ebp),%eax
0x08049045 <+177>: je 0x804904c <phase_3+184>
0x08049047 <+179>: call 0x8049321 <explode_bomb>
0x0804904c <+184>: leave
0x0804904d <+185>: lea 0x0(%esi),%esi
0x08049050 <+188>: ret
End of assembler dump.
(gdb)
那是第二个。继续前进!
0 1
断点1,0x08048f9a在相位_3()
(gdb)disas
功能阶段_3的汇编程序代码转储:
0x08048f94:推送%ebp
0x08048f95:mov%esp,%ebp
0x08048f97:子$0x28,%esp
=>0x08048f9a:lea-0x10(%ebp),%eax
0x08048f9d:mov%eax,0xc(%esp)
0x08048fa1:lea-0xc(%ebp),%eax
0x08048fa4:mov%eax,0x8(%esp)
0x08048fa8:movl$0x804a58c,0x4(%esp)
0x08048fb0:mov 0x8(%ebp),%eax
0x08048fb3:mov%eax,(%esp)
0x08048fb6:调用0x8048894
0x08048fbb:cmp$0x1,%eax
0x08048fbe:jg 0x8048fc5
0x08048fc0:调用0x8049321
0x08048fc5:cmpl$0x7,-0xc(%ebp)
0x08048fc9:ja 0x8049032
0x08048fcb:mov-0xc(%ebp),%eax
0x08048fce:xchg%ax,%ax
0x08048fd0:jmp*0x804a4c0(,%eax,4)
0x08048fd7:mov$0x0,%eax
0x08048fdc:lea 0x0(%esi,%eiz,1),%esi
0x08048fe0:jmp 0x804902d
0x08048fe2:mov$0x0,%eax
0x08048fe7:jmp 0x804902a
0x08048fe9:mov$0x0,%eax
0x08048费用:xchg%ax,%ax
0x08048ff0:jmp 0x8049027
0x08048ff2:mov$0x0,%eax
0x08048ff7:jmp 0x8049024
0x08048ff9:mov$0x0,%eax
0x08048ffe:xchg%ax,%ax
0x08049000:jmp 0x8049021
0x08049002:mov$0x0,%eax
0x08049007:jmp 0x804901c
0x08049009:mov$0x30d,%eax
0x0804900e:xchg%ax,%ax
0x08049010:jmp 0x8049017
0x08049012:mov$0x0,%eax
0x08049017:子$0x264,%eax
0x0804901c:添加$0x3b8,%eax
0x08049021:子$0x49,%eax
0x08049024:添加$0x49,%eax
0x08049027:子$0x49,%eax
0x0804902a:添加$0x49,%eax
0x0804902d:子$0x49,%eax
0x08049030:jmp 0x804903c
0x08049032:调用0x8049321
0x08049037:mov$0x0,%eax
0x0804903c:cmpl$0x5,-0xc(%ebp)
0x08049040:jg 0x8049047
0x08049042:cmp-0x10(%ebp),%eax
0x08049045:je 0x804904c
0x0804947:调用0x8049321
0x0804904c:离开
0x0804904d:lea 0x0(%esi),%esi
0x08049050:ret
汇编程序转储结束。
(gdb)
您提到的第一个比较(位于+39
的比较)是比较%eax
,它保存来自sscanf
的返回值。因此,它只是测试可以转换多少个参数。此代码需要2
,因此,如果(sscanf()>1)转到ok,则代码正在执行;引爆炸弹()代码>
+49
处的比较是检查第一个数字,如果((无符号)x>7)爆炸,它将执行我希望这是显而易见的
接下来,在+60
,这段代码中有一条最重要的指令:jmp*0x804a4c0(,%eax,4)
。那是一个跳台。它将根据%eax
中的值将您带到不同的位置,此时该值保存着您的第一个输入。我们知道输入介于0
和7
之间,因此该表中有8个条目。您应该能够使用x/8a 0x804a4c0
检查它们。很可能它们是下面代码块中的不同地址,流在+163
处重新连接。编译器通常使用此模式来实现开关
语句
第+168
行进一步将第一个数字限制在0
和5
之间,第+174
行将第二个数字与%eax
的当前值进行比较,并在不匹配时引爆炸弹。这告诉我们有效的输入是6对。我们可以选择任意的第一个数字,通过跳转表查看将在%eax
中放置的值,并将其作为第二个数字输入