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