首先下载附件,然后进行查壳操作,发现是64bit的,那就拖进ida64中接着我们再进入main函数查看,并进行简单的分析,可以在一旁写上注释这边最关键的一句话,在于*(&t + i + 10)=s[i] + v3 ,其中s数组为已知,点进去复制出来,这边有一个注意的点,*(&t)这边有*运算符,联想到是应用指针了,那后面的+i+10,就可以理解为是从地址t开始往后的第+i+10位,也就是说*(),该括号内表示的是t的地址,然后我们点进s看看,这边有一个小坑,就是需要选中53h,然后按a将其转换为字符形式,然后就会变成SharifCTF,这点一定要记得!然后嘞,我们写代码就行了,上代码
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char s[]="c61b68366edeb7bdce3c6820314b7498";
int v3;
char flag;
for(int i=0;i<strlen(s);++i)
{
if((i&1)!=0){
v3=1;
} else {
v3=-1;
}
flag=s[i]+v3;
cout<<flag;
}
return 0;
}
根据原代码,照葫芦画瓢就行,s是已知数组,最后得到结果
b70c59275fcfa8aebf2d5911223c6589
然后再把之前的前缀加上去,就得出正确的flag喽
总结一下,这道题不难的,我当时没做出就是那个53h没转换为字符形式,然后就不会了,这道题对于其他人来说,做不出来的点应该是那个*()这边没有弄明白,所以我们看到*需要敏感,联想到指针,括号内的就当作是地址就行。