下载附件,第一件事,看后缀名
为什么要强调,因为我以为是跟第一二题一样,是没有后缀的东西,直接扔进去IDA
然后发现报错,以为有壳,扔进OD手动脱壳,发现OD也打不开
后来才发现这是ZIP压缩包
解压出来后,ctrl+F12,搜索flag
进入后,ctrl+x 查找调用处
我把代码搬过来,写备注分析
// 从这里开始是正题
sub_41132F("please enter the flag:", v7);
sub_411375("%20s", (char)Str); // 我们写入的东西放入变量 Str,并强转字符类型
v3 = j_strlen(Str); // 输入字符的数量放入变量 v3
v4 = (const char *)sub_4110BE(Str, v3, v14); // 这里最屌,这是base64编码,后面讲
strncpy(Destination, v4, 0x28u); // 编码后,复制内容,放入变量 Destination,复制长度为28字符
v11 = j_strlen(Destination); // 获取字符串长度,放入变量 v11
// 开启 for 循环,有多少字符就循环多少次
for ( j = 0; j < v11; ++j )
// 替换字符
Destination[j] += j; // 每一个字符转成数字,都加上循环数字j,再转成ascii码得到字符
v5 = j_strlen(Destination); // 也是检测字符串长度
if ( !strncmp(Destination, Str2, v5) ) // 变量Destination 与 常量Str2 进行比较
sub_41132F("rigth flag!\n", v8); // 相等就输出;
else
sub_41132F("wrong flag!\n", v8);
return 0;
搞了一大轮,很多代码是重复来干扰你的,
光是strlen就出现了好几次,
其实都是检测我们输入的字符串长度而已
读完源代码,其实就是把我们输入的内容首先经过base64加密
再经过for循环加密
与Str2这个常量进行判断,所以逻辑贼简单
Str2点击进去能看到内容:e3nifIH9b_C@n@dH
反向for循环解码,再解码base64就可以了
int main(){
char Str2 [] = "e3nifIH9b_C@n@dH"; // 常量
int j = strlen(Str2)-1; // 长度是16,但索引是0-15,所以要减一
for( ; j>=0; j--){ // 反向for循环,从大到小
Str2[j] = Str2[j] - j; // 减回去就行了
}
printf("%s",Str2);
return 0;
}
最后解码:{i_l0ve_you}
flag{i_l0ve_you}
吐槽一下:那个base64函数编码,都不知道大神是怎么看出来base64编码的,我放进文心千帆的AI也判断不出来,反编译都乱成这样,你们居然也能看出来,NB啊