我今天拆了个炸弹

今天群友发来一段汇编代码,说这是一个炸弹程序,需要输入6个数字解开,输错就炸了,

在线等,挺急的

代码如下:

08048b54 <phase_2>:
 8048b54:	53                   	push   %ebx
 8048b55:	83 ec 30             	sub    $0x30,%esp
 8048b58:	65 a1 14 00 00 00    	mov    %gs:0x14,%eax
 8048b5e:	89 44 24 24          	mov    %eax,0x24(%esp)
 8048b62:	31 c0                	xor    %eax,%eax
 8048b64:	8d 44 24 0c          	lea    0xc(%esp),%eax
 8048b68:	50                   	push   %eax
 8048b69:	ff 74 24 3c          	pushl  0x3c(%esp)
 8048b6d:	e8 a1 07 00 00       	call   8049313 <read_six_numbers>
 8048b72:	83 c4 10             	add    $0x10,%esp
 8048b75:	83 7c 24 04 00       	cmpl   $0x0,0x4(%esp)
 8048b7a:	79 05                	jns    8048b81 <phase_2+0x2d>
 8048b7c:	e8 55 07 00 00       	call   80492d6 <explode_bomb>
 8048b81:	bb 01 00 00 00       	mov    $0x1,%ebx
 8048b86:	89 d8                	mov    %ebx,%eax
 8048b88:	03 04 9c             	add    (%esp,%ebx,4),%eax
 8048b8b:	39 44 9c 04          	cmp    %eax,0x4(%esp,%ebx,4)
 8048b8f:	74 05                	je     8048b96 <phase_2+0x42>
 8048b91:	e8 40 07 00 00       	call   80492d6 <explode_bomb>
 8048b96:	83 c3 01             	add    $0x1,%ebx
 8048b99:	83 fb 06             	cmp    $0x6,%ebx
 8048b9c:	75 e8                	jne    8048b86 <phase_2+0x32>
 8048b9e:	8b 44 24 1c          	mov    0x1c(%esp),%eax
 8048ba2:	65 33 05 14 00 00 00 	xor    %gs:0x14,%eax
 8048ba9:	74 05                	je     8048bb0 <phase_2+0x5c>
 8048bab:	e8 e0 fb ff ff       	call   8048790 <__stack_chk_fail@plt>
 8048bb0:	83 c4 28             	add    $0x28,%esp
 8048bb3:	5b                   	pop    %ebx
 8048bb4:	c3                   	ret

经过ida的反汇编后,转成的C语言如下:

int __cdecl phase_2(int a1)
{
  signed int v1; // ebx@3
  int result; // eax@7
  int v3; // [sp+8h] [bp-2Ch]@4
  int v4[6]; // [sp+Ch] [bp-28h]@1
  int v5; // [sp+24h] [bp-10h]@1

  v5 = *MK_FP(__GS__, 20);
  read_six_numbers(a1, v4);
  if ( v4[0] < 0 )
    explode_bomb();
  v1 = 1;
  do
  {
    if ( v4[v1] != *(&v3 + v1) + v1 )
      explode_bomb();
    ++v1;
  }
  while ( v1 != 6 );
  result = *MK_FP(__GS__, 20) ^ v5;
  if ( *MK_FP(__GS__, 20) != v5 )
    __stack_chk_fail();
  return result;
}

要破解这个密码的关键是在

v1 = 1;
  do
  {
    if ( v4[v1] != *(&v3 + v1) + v1 )
      explode_bomb();
    ++v1;
  }
while ( v1 != 6 );

很多人说看不懂这一句,尤其是V3的值不知道是什么

如果对C不太熟悉的话,确实为难

v3是一个整数,&v3则是一个整型指针,&v3+1,其实就是v4了,假设v3的内存地址是0x80000000,

那v4的内存地址就是0x80000004,为什么是+4呢?因为一个整型指针占了4字节啊

当清楚以上概念后,这题就好解了

 v1=1时,v4[1]=v4[0]+1

 v1=2时,v4[2]=v4[1]+2

 v1=3时,v4[3]=v4[2]+3

 v1=4时,v4[4]=v4[3]+4

 v1=5时,v4[5]=v4[4]+5

假设v4[0]为1,则密码就是1,2,4,7,11,16

其它密码也是可以的,只要按着这公式套就好

最终群友打赏20,以资鼓励^^

猜你喜欢

转载自blog.csdn.net/kof98765/article/details/128021011