CSAPP中bomblab的一题
该问题来源于bomblab中phase4,具体是一个递归的题,phase4和func4的代码分别如下:
phase_4:
0x08048d3d <+0>: sub $0x1c,%esp
0x08048d40 <+3>: mov %gs:0x14,%eax
0x08048d46 <+9>: mov %eax,0xc(%esp)
0x08048d4a <+13>: xor %eax,%eax
0x08048d4c <+15>: lea 0x4(%esp),%eax
0x08048d50 <+19>: push %eax
0x08048d51 <+20>: lea 0xc(%esp),%eax
0x08048d55 <+24>: push %eax
0x08048d56 <+25>: push $0x804a521
0x08048d5b <+30>: pushl 0x2c(%esp)
0x08048d5f <+34>: call 0x8048880 <__isoc99_sscanf@plt>
0x08048d64 <+39>: add $0x10,%esp
0x08048d67 <+42>: cmp $0x2,%eax
0x08048d6a <+45>: jne 0x8048d78 <phase_4+59>
0x08048d6c <+47>: mov 0x4(%esp),%eax
0x08048d70 <+51>: sub $0x2,%eax
0x08048d73 <+54>: cmp $0x2,%eax
0x08048d76 <+57>: jbe 0x8048d7d <phase_4+64>
0x08048d78 <+59>: call 0x80492dc <explode_bomb>
0x08048d7d <+64>: sub $0x8,%esp
0x08048d80 <+67>: pushl 0xc(%esp)
0x08048d84 <+71>: push $0x6
---Type <return> to continue, or q <return> to quit---return
0x08048d86 <+73>: call 0x8048cfa <func4>
0x08048d8b <+78>: add $0x10,%esp
0x08048d8e <+81>: cmp 0x8(%esp),%eax
0x08048d92 <+85>: je 0x8048d99 <phase_4+92>
0x08048d94 <+87>: call 0x80492dc <explode_bomb>
0x08048d99 <+92>: mov 0xc(%esp),%eax
0x08048d9d <+96>: xor %gs:0x14,%eax
0x08048da4 <+103>: je 0x8048dab <phase_4+110>
0x08048da6 <+105>: call 0x80487e0 <__stack_chk_fail@plt>
0x08048dab <+110>: add $0x1c,%esp
0x08048dae <+113>: ret
func4:
0x08048cfa <+0>: push %edi
0x08048cfb <+1>: push %esi
0x08048cfc <+2>: push %ebx
0x08048cfd <+3>: mov 0x10(%esp),%ebx
0x08048d01 <+7>: mov 0x14(%esp),%edi
0x08048d05 <+11>: test %ebx,%ebx
0x08048d07 <+13>: jle 0x8048d34 <func4+58>
0x08048d09 <+15>: mov %edi,%eax
0x08048d0b <+17>: cmp $0x1,%ebx
0x08048d0e <+20>: je 0x8048d39 <func4+63>
0x08048d10 <+22>: sub $0x8,%esp
0x08048d13 <+25>: push %edi
0x08048d14 <+26>: lea -0x1(%ebx),%eax
0x08048d17 <+29>: push %eax
0x08048d18 <+30>: call 0x8048cfa <func4>
0x08048d1d <+35>: add $0x8,%esp
0x08048d20 <+38>: lea (%edi,%eax,1),%esi
0x08048d23 <+41>: push %edi
0x08048d24 <+42>: sub $0x2,%ebx
0x08048d27 <+45>: push %ebx
0x08048d28 <+46>: call 0x8048cfa <func4>
0x08048d2d <+51>: add $0x10,%esp
0x08048d30 <+54>: add %esi,%eax
0x08048d32 <+56>: jmp 0x8048d39 <func4+63>
0x08048d34 <+58>: mov $0x0,%eax
0x08048d39 <+63>: pop %ebx
0x08048d3a <+64>: pop %esi
0x08048d3b <+65>: pop %edi
0x08048d3c <+66>: ret
然后我个人写了一段c代码来模拟func4:
int eax;
void func4(int ebx,int edi){
int esi;
if((ebx&ebx)<=0)
eax=0;
else{
// int esi;
eax = edi;
if(ebx!=1){
eax = ebx-1;
func4(eax,edi);
esi = edi+eax*1;
ebx-=2;
func4(ebx,edi);
eax+=esi;
}
}
}
关于这题我的理解是,phase_4对两个参数的要求是,第一个小于四,然后func4(6,第一个参数)==第二个参数,但是未能得出正确答案,希望哪位大牛能帮忙看看我的思路哪里出了问题,或者是从一开始就是错误的,感激不尽。
补充:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
看起来func4应该长这样。