Assembly 二元炸弹第四阶段
我正在做二元炸弹任务,在我进入第四阶段之前,一切都很顺利。我已经坚持了好几天了。到目前为止,我知道这个阶段正在寻找两个数字。我从x/s 0x804a5bf线+20知道这一点。我真正困惑的是它何时需要func4。它看起来像一个递归,但我不知道它在做什么。我还认为我必须检查+6和+13行,但我不知道如何检查。我是gdb和汇编代码的新手,所有这些都很难理解Assembly 二元炸弹第四阶段,assembly,x86,reverse-engineering,Assembly,X86,Reverse Engineering,我正在做二元炸弹任务,在我进入第四阶段之前,一切都很顺利。我已经坚持了好几天了。到目前为止,我知道这个阶段正在寻找两个数字。我从x/s 0x804a5bf线+20知道这一点。我真正困惑的是它何时需要func4。它看起来像一个递归,但我不知道它在做什么。我还认为我必须检查+6和+13行,但我不知道如何检查。我是gdb和汇编代码的新手,所有这些都很难理解 Dump of assembler code for function phase_4: 0x08048ccb <+0>: pu
Dump of assembler code for function phase_4:
0x08048ccb <+0>: push %ebp
0x08048ccc <+1>: mov %esp,%ebp
0x08048cce <+3>: sub $0x28,%esp
0x08048cd1 <+6>: lea -0x10(%ebp),%eax
0x08048cd4 <+9>: mov %eax,0xc(%esp)
0x08048cd8 <+13>: lea -0xc(%ebp),%eax
0x08048cdb <+16>: mov %eax,0x8(%esp)
0x08048cdf <+20>: movl $0x804a5bf,0x4(%esp)
0x08048ce7 <+28>: mov 0x8(%ebp),%eax
0x08048cea <+31>: mov %eax,(%esp)
0x08048ced <+34>: call 0x8048860 <__isoc99_sscanf@plt>
0x08048cf2 <+39>: cmp $0x2,%eax
0x08048cf5 <+42>: jne 0x8048d02 <phase_4+55>
0x08048cf7 <+44>: mov -0x10(%ebp),%eax
0x08048cfa <+47>: sub $0x2,%eax
0x08048cfd <+50>: cmp $0x2,%eax
0x08048d00 <+53>: jbe 0x8048d07 <phase_4+60>
0x08048d02 <+55>: call 0x80491a6 <explode_bomb>
0x08048d07 <+60>: mov -0x10(%ebp),%eax
0x08048d0a <+63>: mov %eax,0x4(%esp)
0x08048d0e <+67>: movl $0x8,(%esp)
0x08048d15 <+74>: call 0x8048c7f <func4>
0x08048d1a <+79>: cmp -0xc(%ebp),%eax
0x08048d1d <+82>: je 0x8048d24 <phase_4+89>
0x08048d1f <+84>: call 0x80491a6 <explode_bomb>
0x08048d24 <+89>: leave
0x08048d25 <+90>: ret
End of assembler dump.
This is the func4 code dump
0x08048c7f <+0>: push %ebp
0x08048c80 <+1>: mov %esp,%ebp
0x08048c82 <+3>: push %edi
0x08048c83 <+4>: push %esi
0x08048c84 <+5>: push %ebx
0x08048c85 <+6>: sub $0x1c,%esp
0x08048c88 <+9>: mov 0x8(%ebp),%ebx
0x08048c8b <+12>: mov 0xc(%ebp),%esi
0x08048c8e <+15>: test %ebx,%ebx
0x08048c90 <+17>: jle 0x8048cbe <func4+63>
0x08048c92 <+19>: mov %esi,%eax
0x08048c94 <+21>: cmp $0x1,%ebx
0x08048c97 <+24>: je 0x8048cc3 <func4+68>
0x08048c99 <+26>: mov %esi,0x4(%esp)
0x08048c9d <+30>: lea -0x1(%ebx),%eax
0x08048ca0 <+33>: mov %eax,(%esp)
0x08048ca3 <+36>: call 0x8048c7f <func4>
0x08048ca8 <+41>: lea (%eax,%esi,1),%edi
0x08048cab <+44>: mov %esi,0x4(%esp)
0x08048caf <+48>: sub $0x2,%ebx
0x08048cb2 <+51>: mov %ebx,(%esp)
0x08048cb5 <+54>: call 0x8048c7f <func4>
0x08048cba <+59>: add %edi,%eax
0x08048cbc <+61>: jmp 0x8048cc3 <func4+68>
0x08048cbe <+63>: mov $0x0,%eax
0x08048cc3 <+68>: add $0x1c,%esp
0x08048cc6 <+71>: pop %ebx
0x08048cc7 <+72>: pop %esi
0x08048cc8 <+73>: pop %edi
0x08048cc9 <+74>: pop %ebp
0x08048cca <+75>: ret
功能阶段4的汇编程序代码转储:
0x08048ccb:推送%ebp
0x08048ccc:mov%esp,%ebp
0x08048cce:sub$0x28,%esp
0x08048cd1:lea-0x10(%ebp),%eax
0x08048cd4:mov%eax,0xc(%esp)
0x08048cd8:lea-0xc(%ebp),%eax
0x08048cdb:mov%eax,0x8(%esp)
0x08048cdf:movl$0x804a5bf,0x4(%esp)
0x08048ce7:mov 0x8(%ebp),%eax
0x08048cea:mov%eax,(%esp)
0x08048ced:调用0x8048860
0x08048cf2:cmp$0x2,%eax
0x08048cf5:jne 0x8048d02
0x08048cf7:mov-0x10(%ebp),%eax
0x08048cfa:sub$0x2,%eax
0x08048cfd:cmp$0x2,%eax
0x08048d00:jbe 0x8048d07
0x08048d02:调用0x80491a6
0x08048d07:mov-0x10(%ebp),%eax
0x08048d0a:mov%eax,0x4(%esp)
0x08048d0e:movl$0x8,(%esp)
0x08048d15:调用0x8048c7f
0x08048d1a:cmp-0xc(%ebp),%eax
0x08048d1d:je 0x8048d24
0x08048d1f:调用0x80491a6
0x08048424:离开
0x08048d25:ret
汇编程序转储结束。
这是func4代码转储
0x08048c7f:推送%ebp
0x08048c80:mov%esp,%ebp
0x08048c82:推送%edi
0x08048c83:推送%esi
0x08048c84:推送%ebx
0x08048c85:子$0x1c,%esp
0x08048c88:mov 0x8(%ebp),%ebx
0x08048c8b:mov 0xc(%ebp),%esi
0x08048c8e:测试%ebx,%ebx
0x08048c90:jle 0x8048cbe
0x08048c92:mov%esi,%eax
0x08048c94:cmp$0x1,%ebx
0x08048c97:je 0x8048cc3
0x08048c99:mov%esi,0x4(%esp)
0x08048c9d:lea-0x1(%ebx),%eax
0x08048ca0:mov%eax,(%esp)
0x08048ca3:调用0x8048c7f
0x08048ca8:lea(%eax,%esi,1),%edi
0x08048cab:移动%esi,0x4(%esp)
0x08048caf:sub$0x2,%ebx
0x08048cb2:mov%ebx,(%esp)
0x08048cb5:调用0x8048c7f
0x08048cba:添加%edi,%eax
0x08048cbc:jmp 0x8048cc3
0x08048cbe:mov$0x0,%eax
0x08048cc3:添加$0x1c,%esp
0x08048cc6:弹出%ebx
0x08048cc7:弹出%esi
0x08048cc8:pop%edi
0x08048cc9:弹出%ebp
0x08048cca:ret
有机会看到实际的源代码吗?没有源代码。显然这是一项非常有名的任务。我们只得到了可执行文件,我们必须用GDB解决这些阶段。总共有六个阶段,我只到了第四个阶段。查看lea
的功能。总的来说,我发现在每一行中添加注释是很有用的,这些注释用伪代码解释了它的功能。例如,0x08048c9d
是eax=ebx-1
。每行重复一次,然后重试。另请参阅是否有帮助。请注意,这并不完全相同,当然这是一个64位的构建。我仍然感到困惑。我发现在func4的+15行,它正在测试8对8。它在哪里测试8?