ctf.show新手必刷_菜狗杯 杂项签到/损坏的压缩包/谜之栅栏/你会数数吗/你会异或吗

发布时间 2023-12-22 22:07:11作者: liyishui

杂项签到

下完压缩包打开获得一张糊糊的图片

丢进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~