1.一开始就往ida里面扔,然后就俩函数,可能是有壳,于是把题扔到detect it easy。查出一个upx壳,然后脱壳。
2.再打开找到main函数,主要是
if ( (&v4 + i) != data_start_[((char *)&v16 + i) - 1] ) 这一句话。
__main();
v4 = 42;
v5 = 70;
v6 = 39;
v7 = 34;
v8 = 78;
v9 = 44;
v10 = 34;
v11 = 40;
v12 = 73;
v13 = 63;
v14 = 43;
v15 = 64;
printf("Please input:");
scanf("%s", &v19);
if ( (_BYTE)v19 != 65 || HIBYTE(v19) != 67 || v20 != 84 || v21 != 70 || v22 != 123 || v26 != 125 )
return 0;
v16 = v23;
v17 = v24;
v18 = v25;
for ( i = 0; i <= 11; ++i )
{
if ( *(&v4 + i) != _data_start__[*((char *)&v16 + i) - 1] )
return 0;
}
printf("You are correct!");
return 0;
}
将输入的 flag先是-1,再从_data_start__数组中找到相应的数然后到v4数组里寻找有无。
所以可以跟着逆向了。
3
里面的\是代表\,如果单\是转义字符会有问题,
这里面的j是代表的_data_start__里的下标,和v4里面的数字做对比,到后面再flag-1=j
然后由j求flag,如下代码。
Key = '~}|{zyxwvutsrqponmlkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(' + chr(0x27) + '&%$# !"'
v4=[42,70,39,34,78,44,34,40,73,63,43,64]
flag=""
for i in v4 :
for j in range(1,len(Key)):
if i ==ord(Key[j]):
flag += chr(j+1)
print(flag)