[BUUCTF]simpleRev
放入IDE中,找到main函数
查看伪代码
发现主要函数为Decry(),点击进入
进入Decry()函数
分析函数
*(_QWORD *)src = 357761762382LL;
v7 = 0LL;
v8 = 0;
v9 = 512969957736LL;
v10 = 0LL;
v11 = 0;
text = (char *)join(key3, &v9);
strcpy(key, key1);
strcat(key, src);
v2 = 0;
v3 = 0;
主要是一些变量的赋值,关键在于src和v9这两个变量,我这里显示的是数字,可以按R来显示实际赋的值
src =‘SLCDN’
v9=‘wodah’
还需要注意的是,x86cpu中存储是小端存储,因此,实际存储的应该是倒过来的
text = (char *)join(key3, &v9);
strcpy(key, key1);
strcat(key, src);
text是用连接函数连接出来的,key3可以看到是kills,于是,text=‘killshadow’
src是用复制和连接函数生成的,src=‘ADSFKNDCLS’
for ( i = 0; i < v5; ++i )
{
if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 )
key[i] = key[v3 % v5] + 32;
++v3;
}
这个循环的作用就是将key数组中ASCII码在64和90之间的字符都加32,实际上就是把key数组中的大写字母全部变成小写字母
key= 'ADSFKNDCLS'
v3=0
v5=len(key)
for i in range(v5):
if (ord(key[v3%v5])> 64 and ord(key[v3%v5])<=90):
print(chr(ord(key[v3 % v5])+32),end='')
v3+=1
因此现在key数组现在是’adsfkndcls‘
while ( 1 )
{
v1 = getchar();
if ( v1 == '\n' )
break;
if ( v1 == ' ' )
{
++v2;
}
else
{
if ( v1 <= '`' || v1 > 'z' )
{
if ( v1 > '@' && v1 <= 'Z' )
str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
}
else
{
str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
}
if ( !(v3 % v5) )
putchar(32);
++v2;
}
}
这一段是对flag的处理,flag用v1数组进行保存遇到回车键就结束,通过查看ASIIC码表可以看出,flag只能是字母组成。将输入的字母进行处理后放入str2数组中
if ( !strcmp(text, str2) )
puts("Congratulation!\n");
若str2和之前的text相同,就说明我们的flag正确。
求flag
我们可以用暴力破解的方法,将每一个字母都带入处理的式子中,并将结果与text中的进行对比,找到使结果成立的字母
脚本如下
key = 'adsfkndcls'
flag =''
text = 'killshadow'
for i in range(len(text)):
for x in range(65,123):
if text[i] == chr((x-39-ord(key[i]) + 97) % 26 +97):
flag= flag+chr(x)
break
print('flag{'+flag+'}')