0x01 前言
这是2020年的第一场的ctf比赛,它已经结束两天,虽然好多大学生们都在准备着期末考试,但这个比赛的热度还有持续着呢,由于网络上关于这个比赛的题解,几乎很少或者不太详细,我就整理了一份详细的题解,没有全部记录,舍去了简单题的记录!并且本文中还夹有一些做题技巧,希望帮到大家!
0x02 Crypto1下载得到 encode.py,fflag.png,fflag_e.png,flag_e.flag 四个文件
我们看下加密脚本encode.py 的内容:
from itertools import *
from key import key
ki= cycle(key)
fr1 = open("flag.png","rb")
fr2 = open("fflag.png","rb")
fw1 = open("flag_e.png","wb")
fw2 = open("fflag_e.png","wb")
for now in fr1:
for nowByte in now:
newByte = nowByte ^ ord(next(ki))
fw1.write(bytes([newByte]))
fr1.close()
fw1.close()
for now in fr2:
for nowByte in now:
newByte = nowByte ^ ord(next(ki))
fw2.write(bytes([newByte]))
fr2.close()
fw2.close()
我们简单分析下加密脚本encode.py:
flag.png的每个字节与迭代器 ki[]中数据循环进行 亦或运算 得到 flag_e.flag fflag.png的每个字节与迭代器 ki[]中数据循环进行 亦或运算 得到fflag_e.png 两个图片的 加密算法 是一样的
思路很明确:要得到 flag.png:
现在我们知道 fflag_e.png 和 fflag.png ,所以我们可以反推出 迭代器 ki[] 中的数据。然后 我们再通过 ki[] 和 flag_e.flag 反推出 flag.png
迭代器 ki[]中数据 = fflag.png的每个字节 与fflag_e.png的每个字节 循环进行 亦或运算 flag.png的每个字节 = 迭代器 ki[]中数据 与 flag_e.flag的每个字节 循环进行 亦或运算
我们可以参考它给的 加密脚本encode.py 来写 出解密脚本decode1.py
#coding:utf8
fflag= open("fflag.png","rb")
fflag_e= open("fflag_e.png","rb")
fflag_zijie=[]
fflag_e_zijie=[]
ki=[]
for now in fflag:
for nowByte in now:
fflag_zijie.append(nowByte)
#print fflag_zijie
print len(fflag_zijie)#5165
for now in fflag_e:
for nowByte in now:
fflag_e_zijie.append(nowByte)
# print fflag_e_zijie
print len(fflag_e_zijie)#5165
for i in range(len(fflag_zijie)):
ki.append(ord(fflag_zijie[i])^ord(fflag_e_zijie[i]))
#print ki#[65, 108, 105, 116, 97, 95, 105, 115, 95, 115, 111, 95, 99, 117, 116, 101] 循环重复
print len(ki)#5165
fflag.close()
fflag_e.close()
flag= open("flag.png","wb")
flag_e= open("flag_e.png","rb")
flag_e_zijie=[]
for now in flag_e:
for nowByte in now:# 通过迭代器逐行访问
flag_e_zijie.append(nowByte)# 通过迭代器逐字符处理
# print flag_e_zijie # 即我们可以得到密钥 key_0=[65,108,105,116,97,95,105,115,95,115,111,95,99,117,116,101]
key_0=[65,108,105,116,97,95,105,115,95,115,111,95,99,117,116,101]
key=''
for i in range(len(key_0)):
key+=chr(key_0[i])
print key;#Alita_is_so_cute
现在我们得到了密钥 key="Alita_is_so_cute",通过它生成迭代器 ki,进而反推出 flag.png
#coding:utf8
from itertools import *
flag= open("flag.png","wb")
flag_e= open("flag_e.png","rb")
flag_e_zijie=[]
key="Alita_is_so_cute"
ki=cycle(key)
for now in flag_e:
for newByte in now:
newByte=ord(newByte)^ord(next(ki))
flag.write(bytes(chr(newByte)))
flag.close()
flag_e.close()
运行,即可得到解密后的flag.png 图片 ,查看图片即可
实验学习:CTF-Crypto练习:http://www.hetianlab.com/cour.do?w=1&c=C172.19.104.182015011915525400001
Crypto是CTF竞赛中的主要题型之一,主要考查密码学相关知识点,CTF-Crypto系列实验覆盖了替换密码、RSA、AES等加密算法,以及中间人攻击、中间相遇攻击等知识点。
0x03 扫雷 mine
我们下载后 得到一个 扫雷游戏的 mine.exe 游戏,打开后
我刚看到这题,蒙了,我的天哪,扫雷啊!这怎么逆向,后来发现不过如此!
首先,这个游戏的玩法和规则是 和我们平时玩的扫雷 游戏一样,
扫雷失败,提示我们 "游戏结束"
猜测,如果我们将 所有类都排出来 便后给我们flag!
然后我们将它拖入ida 中,查看 main函数:
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
FILE *v3; // rax
CONSOLE_SCREEN_BUFFER_INFO csbi; // [rsp+20h] [rbp-30h]
HANDLE handle_out; // [rsp+38h] [rbp-18h]
int j_0; // [rsp+40h] [rbp-10h]
int i_0; // [rsp+44h] [rbp-Ch]
int j; // [rsp+48h] [rbp-8h]
int i; // [rsp+4Ch] [rbp-4h]
_main();
::j = 1;
v3 = __iob_func();
freopen(&Filename, "r", v3);
while ( 1 )
{
handle_out = GetStdHandle(0xFFFFFFF5);
GetConsoleScreenBufferInfo(handle_out, &csbi);
Hide();
Beginning();
a = GetTickCount();
do
{
while ( 1 )
{
do
{
while ( kbhit() == 0 )
{
Sleep(0xAu);
LABEL_44:
b = GetTickCount();
SetConsoleTextAttribute(handle_out, 4u);
position(80, 7);
printf("用时:"); // 游戏结束!
if ( b - a
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录