ctf.show新手必刷_菜狗杯 杂项签到/损坏的压缩包/谜之栅栏/你会数数吗/你会异或吗
杂项签到
下完压缩包打开获得一张糊糊的图片
丢进010editor看一下,既然是签到,会不会直接就藏在里面呢..
ctrl+F搜下ctf,找到flag:
(小提示:记得把查找的对象从Hex Bytes换成Text)
损坏的压缩包
打开压缩包,发现打不开,确实是损坏的压缩包。损坏的话可能是格式不太对,或者格式对了但是内容有问题
图片的格式可以用dat图的前两个字节来区别, jpg= FF D8,png =89 50,gif =47 49,Bmp=42 4D
丢进010editor看下,前两个字节是89 50,这个文件头标识对应的是png。把文件的后缀改成png就能正常显示了。
揣测了一下出题人出这道题,感觉很好出的,只要随便找张图片拿画图软件画上flag,然后把前两个字节改掉
谜之栅栏
打开压缩包发现两张图片,标题叫找不同,丢进010发现前面的部分都很像,我翻到后面的部分看了下发现结尾的部分也很像,坏了真成找不同了。。
当然不能自己来找不同,很多软件自带对比功能,这个肯定也有。Tools->Compare File,然后就发现了不一样的一段:
最开始看到两边各有一个{和},以为直接拼起来,试了一下错了,截取出来后才发现
上下看就好了。
你会数数吗
打开文件(如果用记事本打开可能看不了,最开始还没下010用pycharm开的,pycharm居然可以开欸)发现这么一串字符
其实第一题做的是这题,看到{}以为是某种特征,要把{}作为分隔符去破解密码,还去搜了什么加密方式会有{}这样的字符
看了题解,题目提示“你会数数吗”,统计每个字符出现的词频,然后降序排列,得到
#include<bits/stdc++.h>
using namespace std;
struct node{
char c;
int val;
};
bool mycmp(node a,node b){
return a.val>b.val;
}
int main(){
freopen("lys.in","r",stdin);
string s;
cin>>s;
int n=s.length();
map<char,int>mp;
for(int i=0;i<n;i++){
mp[s[i]]++;
}
int cnt=0;
node a[30];
for(auto it=mp.begin();it!=mp.end();it++){
a[++cnt]=(node){it->first,it->second};
cout<<(it->first)<<" "<<(it->second)<<endl;
}
sort(a+1,a+cnt+1,mycmp);
for(int i=1;i<=cnt;i++){
cout<<a[i].c;
}
}
做完这题才知道原来flag的格式是ctfshow{},接下来对{}就会敏感多了。
你会异或吗
题目给了一个提示:神秘数字0x50
压缩包里给的是png文件,但是打开不了,和上面那题损坏的压缩包一样,损坏的话可能是格式不太对,或者格式对了但是内容有问题。
拿010看下,发现文件的前两个字节是D9 00
D9 00是什么鬼,格式给的不是png吗?和上面的损坏压缩包一样
“jpg= FF D8,png =89 50,gif =47 49,Bmp=42 4D”
89 50 和 D9 00再加上0x50,它们会有什么样的关系呢?题目提示说你会异或吗,观察第二个字节50和00异或得到50,得到启发:把D9 00拿去和0x50异或下,发现果然得到了89 50,既然前两个字节异或上50就得到正确答案,考虑把整个文件都异或上。
遇到的一个小问题是怎么给图片异或上一个数字,chat给了很有用的办法:用python读取图片,对每个字节异或操作,然后再写出。
# 以二进制模式打开图像文件
with open('C:\\Users\\33245\\Desktop\\misc5\\misc5', 'rb') as file:
# 读取文件内容
file_content = file.read()
# 将每个字节与0x50进行异或操作
result_data = bytes([byte ^ 0x50 for byte in file_content])
# 将异或后的结果写回文件
with open('C:\\Users\\33245\\Desktop\\misc5\\misc5_completed', 'wb') as output_file:
output_file.write(result_data)
print("hiahiahia")
发现输出的文件夹多了结果misc5_completed(py真好用啊),但是还是无法显示,用010打开得到的结果
前两位已经正常了,那可能是没加后缀windows识别不了,加个后缀
得到flag~