2018.7.27
将文件拖进IDA,点开相关文件,得到代码
if ( (unsigned __int8)sub_8048630(&s) )
puts("Flag is right.");
else
puts("Flag is wrong.");
return 0;
由代码可知,if条件成立,才能输出”Flag is right.”所以我们要让sub_8048630()函数返回1,点开sub_8048630()函数得到代码,如下:
int __cdecl sub_8048630(char *s)
{
size_t v1; // eax
int v3; // edx
if ( s )
{
v1 = strlen(s);
if ( v1 )
{
if ( v1 == 29 )
{
v3 = 0;
while ( s[v3] == byte_8049AE0[(unsigned __int8)((unsigned __int8)byte_8049B15[v3] / 3u - 2)] )
{
if ( ++v3 == 29 )
return 1;
}
}
}
}
return 0;
}
要想返回值为1,while循环条件和if条件就要成立。点开byte_8049B15,得到
点住图中灰色部分,按shift+E会得到
空白框中数据就是byte_8049B15数组中的数据,我们把byte_8049AE0后面的6Ch按R键变为字符后,也得到了byte_8049AE0字符串。while循环要成立,我们可以得到s也就是flag,脚本如下:
a=[0x48,0x5D,0x8D,0x24,0x84,0x27,0x99,
0x9F,0x54,0x18,0x1E,0x69,0x7E,0x33,0x15,
0x72,0x8D,0x33,0x24,0x63,0x21,0x54,0x0C,
0x78,0x78,0x78,0x78,0x78,0x1B]
b=[]
c='lk2j9Gh}AgfY4ds-a6QW1#k5ER_T[cvLbV7nOm3ZeX{CMt8SZo]U'
flag=''
for i in range(len(a)):
b.append(int(a[i]/3-2))
for j in range(len(b)):
flag+=c[b[j]]
print (flag)
a++ 和 ++a 的区别
a++ 和 ++a的相同点都是给a+1,不同点是a++是先参加程序的运行再+1,而++a则是先+1再参加程序的运行。例如:
a=2; b = a++; 运行后: b = 2,a =3 ;
a=2; b = ++a; 运行后: b = 3,a =3;
a - - 和 - - a情况与 a + + 和 ++ a相似,a - -为先参加程序运算在-1;- - a为先减1后参加运算