今天群友发来一段汇编代码,说这是一个炸弹程序,需要输入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,以资鼓励^^