题目地址
https://buuoj.cn/challenges#SimpleRev
题解
IDA64打开,F5反编译,双击进入Decry函数。一开始我困在如何将一个int64转换为字符串,百度了许多博客,关于itoa64函数啥的一堆(用VS),都不得行,最后在IDA64里试了试右键,发现点Char就能转为字符串,我…
从网上得知,x86是小端
(不知道我这种判断大端小端的方法是否正确,欢迎大佬指正!)
那么两个字符串需要倒着读
然后继续分析,可以转为C语言运行方便分析
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 char v1; 6 int v2,v3; 7 char src[8]; 8 char str2[30]; 9 char key[30]="adsfkndcls"; 10 char text[30]="killshadow"; 11 int v5 = strlen(key); 12 v3=0; 13 v2=0; 14 printf("Please input your flag:", src); 15 while ( 1 ) 16 { 17 v1 = getchar(); 18 if ( v1 == 10 ) // ' ' 19 break; 20 if ( v1 == 32 ) // ' ' 21 { 22 ++v2; 23 } 24 else 25 { 26 if ( v1 <= 96 || v1 > 122 ) // v1不是小写字母 27 { 28 if ( v1 > 64 && v1 <= 90 ) // v1是大写字母 29 str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97; 30 } 31 else // v1是小写字母 32 { 33 str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97; 34 } 35 if ( !(v3 % v5) ) 36 putchar(32); 37 ++v2; 38 } 39 } 40 if ( !strcmp(text, str2) ) 41 puts("Congratulation! "); 42 else 43 puts("Try again! "); 44 return 0; 45 }
我们能看出,输入flag,flag经过函数转化后得到的str2等于text,即”killshadow”时flag正确。很奇怪的是,当我设定输入的flag均为小写字母时,得到flag:efxkwoxzti,是错误的,flag为均大写字母时,得到flag:
KLDQCUDFZO
是正确的。
我的爆破脚本:
1 #include<bits/stdc++.h> 2 int main() 3 { 4 int v2=0; 5 int v3=0; 6 int v5; 7 int tv3; 8 int i=0; 9 char tmp; 10 char text[20]="killshadow"; 11 char key[20]="adsfkndcls"; 12 v5=strlen(key); 13 char test[20]; 14 char ans; 15 char trans; 16 char x; 17 while(i<=9){ 18 tv3=v3; 19 tmp=text[i]; 20 //ans=97; 21 ans=65; 22 trans=(ans-39-key[tv3++ % v5]+97)%26+97; 23 while(trans!=tmp){ 24 ans=ans+1; 25 tv3=v3; 26 trans=(ans-39-key[tv3++ % v5]+97)%26+97; 27 } 28 printf("%c",ans); 29 v3++; 30 i++; 31 } 32 return 0; 33 }