Chybeta

ASISCTF2017-Simple Crypto-writeup

ASISCTF2017-Simple Crypto-writeup
简单异或加密

Task

1
2
3
4
Begining always needs an interesting challenge, we can assure you, this challenge is an interesting one to begin the CTF!
Challange Updated, please redownload the binary file!
https://asisctf.com/tasks/simple_crypto_e5189fe3d3d64de3d612de266315a9e96dc43787

Solution

下载下来后解压得到两个文件flag.enc和simple.py。flag.enc是加密后的文件,simple.py是加密算法的实现,其代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/python
import random
from secret import FLAG
KEY = 'musZTXmxV58UdwiKt8Tp'
def xor_str(x, y):
if len(x) > len(y):
return ''.join([chr(ord(z) ^ ord(p)) for (z, p) in zip(x[:len(y)], y)])
else:
return ''.join([chr(ord(z) ^ ord(p)) for (z, p) in zip(x, y[:len(x)])])
flag, key = FLAG.encode('hex'), KEY.encode('hex')
enc = xor_str(key * (len(flag) // len(key) + 1), flag).encode('hex')
ef = open('flag.enc', 'w')
ef.write(enc.decode('hex'))
ef.close()

流程如下;

  1. 将FLAG,KEY进行hex编码得到flag,key
  2. 经过xor_str()处理,将flag,key的每一位对应进行异或操作,返回最后的结果后进行一次hex编码,得到enc
  3. 将enc进行hex解码后写入到文件flag.enc中

由于只是进行简单的异或操作,所以解密系统可以归纳如下:

  1. 从flag.enc中读取,并进行hex编码,得到enc
  2. 把KEY进行hex编码,得到key
  3. 将key和enc进行xor_str()处理,并进行一次hex编码,得到flag
  4. 将flag进行hex解码,得到FLAG

据此写出解密脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def xor_str(x, y):
if len(x) > len(y):
return ''.join([chr(ord(z) ^ ord(p)) for (z, p) in zip(x[:len(y)], y)])
else:
return ''.join([chr(ord(z) ^ ord(p)) for (z, p) in zip(x, y[:len(x)])])
ef = open('flag.enc', 'rb')
flag = ef.read()
KEY = 'musZTXmxV58UdwiKt8Tp'
key = KEY.encode('hex')
dec = xor_str(key * (len(flag) // len(key) + 1), flag).encode('hex')
df = open("decflag",'wb')
df.write(dec.decode('hex'))
df.close()

得到的decflag里的一长串字符用hex编辑器处理一下

得到flag:

微信扫码加入知识星球【漏洞百出】
chybeta WeChat Pay

点击图片放大,扫码知识星球【漏洞百出】

本文标题:ASISCTF2017-Simple Crypto-writeup

文章作者:chybeta

发布时间:2017年09月12日 - 07:09

最后更新:2017年09月12日 - 18:09

原始链接:http://chybeta.github.io/2017/09/12/ASISCTF2017-Simple-Crypto-writeup/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。