题目

#这是一首英文诗,但它是加密的。找到标志,并恢复它
from Crypto.Util.strxor import strxor
import base64
import randomdef enc(data, key):key = (key * (len(data) / len(key) + 1))[:len(data)]return strxor(data, key)poem = open('poem.txt', 'r').read()
flag = "hctf{xxxxxxxxxxx}"with open('cipher.txt', 'w') as f:f.write(base64.b64encode(enc(poem, flag[5:-1])))f.close()

附件:

ciMbOQxffx0GHQtSBB0QSQIORihXVQAUOUkHNgQLVAQcAVMAAAMCASFEGQYcVS8BNh8BGAoHFlMAABwCTSVQC2UdMQx5FkkGEQQAAVMAAQtHRCNLF0NSORscMkkaHABSExIYBQseUmBCFgtSKwEWfwELFRcGbzwEDABHVS8DDAcXfwUcMQwCDUUBCgYYSQEBATNKGwQeOkkbPhsYERYGDB0TYzwCUSVCDE8dKh0BNg4GAAkLSVMWHBpHQCxQF08AOhkWPh1OAA0XRQQRBQJKQyVKFghSMA95Gh8LGhEHBB8YEE4UViFaEQEVfwAdfx0GEUUWAAARGxpHTiFQERx4FkkROgUHERMXRTpUCANtYy9RFk8TLEkHNwxOFhcbAhsASR0STC1GCk8UMwYEOhsdfiEdRR0bHU4QSDRLHR0XO0kGMQ0LEgATERYQSQgORDJaWAsXMgYdfxsbGAB4LRYVGxpHUyFXHU8TMQ1TPRsLFREaDB0TSRoIASJGGR1SKwEWfwUBFQFSChVUHQYCASNWFQ0XLRocMgxkNgoAABd+PRkIKwkDEAoTLQ1TKwELVAgHFhoXRU4BUy9OWBsaOkkeMAYAVAQcAVMXCBwEQDNQci4HJwAfNggcDUUXHQcGDAMCASFGCxsaOh0aPAAdGUUQBBoASRoIASNCCBsHLQxTMgAdABx4IxoYBQcJRmBXEApSNgcHOgcdEUUeDBURRU4FVDQDGQMBMEkVNgUCHQsVRQccDE4XVDJGcjsaOhsWfwgcEUUTCQQVEB1HTCVOFx0bOhpTKwEcGxAVDRwBHU4TSSUDHQ4AKwF5FkkMEQkbAAURSSdHQC0pPAYXO0kSLEkaHABSFAYdDBpHQyVCDRsLfwYVfwgbABAfC1MYDA8RRDMpKwcXMQ5TNhpOGgoGRRAcCAEUDWBQFQAZOkkUOhoaARcXbzYCDABHVilPDE8TMxocfxsLAAQbCxYQSQwITyUDCB0dKg0fJkk/HQsVRTURBwlHTDVQGwMXVSYQPBwCAG8mDQERDGQuAShGGR1SMwYFOkVOPUUQAB8dDBgCASlNWAMdKQx5EwYYEUUbFlMVSR4ITiwDFwlSLB0BKg4JGAwcAlMWBRsCDCdRHQocfwgfOAgLfiQBRRcRGgELQDRGWAIbPBsccgsbBhYGRRwSSRkOTyQpOgMXOg0aMQ5OAA0ACgYTAU4KWGBVHQYcLGMqOggcB0UBERIAAAEJRCQDEQFSKwEWfwsLGAwXA3kyBhsVKwkDGgoeNgwFOkkaHAQGRRIYBU4EQC4DEAoTLWM2KQwAVAQcERoXAB4GVSUDHAYBPBsWKwxCVCxSCBYASRoPRGBMDAcXLUkHNwwHBkUdEh1+OgEKRGBAGQFSMQYHfw4cFRYCRQccDE4KTi1GFht4EwwVK0kaG0UGDRZULA8UVWBXF08VMEkkOhoaWEUGDRZUDQsGRWBODRwGfwccK0kcEREHFx1UHQFHTy9UEAoAOmMgOgxCVCxSEhYVG049QC4DPgMdKAwBLEkBGkUfHFMcDA8DDWBKFk8UKgUffwsCGwofRRIYBgAAATRLHU8FPhBTPgUCVBEaAFMDCBdtZzJGCRoXMR0fJkkDHRYBABdUGgEKRGwDGhoGfwgfLAZOEAAXFR8NSQMIVyVHWA0Lfx4aMQ1CVAMACgAARU4UTy9UWAAAfxsSNgdkMgwEAHkkGw8NTyEDKA4APgQaKwhCVBYdCh1UCB1HUi9MFk8TLGMfNg8LVAcXRRERCBsTSCZWFE8eNgIWfxobGQgXF1MSBQEQRDJQWA4cO0kXOggaHEUeDBgRSQ8SVTVOFk8eOggFOhpkNQkBClMXCBwCASFBFxoGfx4bPh1OHAQB

分析

题目中比较重要的就是enc函数,其传参有需要加密的data和密钥key

key = (key * (len(data) / len(key) + 1))[:len(data)]

将key扩展为可加密data的长度,并将长于(多余)data的部分丢弃。([:len(data)])。扩展方式为重复key,类似维吉尼亚密码。

如:明文长度为11,密钥为ok,则密钥扩展为:okokokokoko

而此题中的密钥即为我们所要求的flag

附件中保存的密文是英文诗填充flag 异或后再base64之后的结果

因为明文是英文诗, 则明文空间为:[a-z]+[A-Z]+[0-9]+常用英文标点符号

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-,.!? :;"’@&()+=%’\n0123456789

所以我们第一时间会想到密文 ^明文=flag,但flag的位数不定。

假设,如果我们知道了flag的位数,或者我们可以试出flag的位数,那么就可以把整个密文或明文分成很多组,每一组的长度就为flag的长度。然后每一组中对应的位置的flag字符应相同,若用我们的明文空间对密文进行异或,每一组的异或值都将出现对应的位置的flag字符。那么该怎么验证这个位数是正确的呢?

明文空间是小于ascii码表示字符的,则一位密文与明文空间异或得到的一个数组明显是小于ascii码所表示的字符的。若假设的位数分组后,每一组对应的位次与明文空间异或后有着交集(交集可能不唯一),但flag是会存在在交集中且将所有的集合并起来的话,flag位数的概率应会是最大的。

则如果对应位次异或值相同,我们就认为,位次假设可能正确

def get_key(i,j):list = []for a in dictionary:for b in dictionary:if ord(a) ^ cipher[i] == ord(b) ^ cipher[j]:list.append(chr(ord(a) ^ cipher[i]))return list

根据上面这一分析,我们就采用分组然后使用明文空间爆破的形式。

先用xortools给我们提供一个位数可能方向

然后排除一下长度为1的情况,我们大致定为range(2,28)

然后选择出现频率最大的作为flag的字符,然后再去看一看输出的结果即可找出正确的flag与位数

collections

常用类型有:

计数器(Counter)

双向队列(deque)

默认字典(defaultdict)

有序字典(OrderedDict)

可命名元组(namedtuple)

这里我们主要用了Counter类型:

s = 'abccbaccba'
获取各元素的个数,返回字典
print(Counter(s))   # Counter({'c': 4, 'b': 3, 'a': 3})most_common
most_common(d) 按照元素出现的次数进行从高到低的排序,返回前d个元素的字典
本题中就用该方法可以选出概率最大的那个元素
from Crypto.Util.strxor import strxor
import base64
import string
import collections
with open(r"D:\\Mango\\xorgame\\cipher.txt",'r') as f:s=f.read()
cipher=list(base64.b64decode(s))
with open(r"D:\\Mango\\xorgame\\analyze.txt",'w') as p:p.write("".join(list(map(chr,base64.b64decode(s)))))
#print(cipher)
dictionary=string.ascii_letters+ "-,.!? :;\"@&()+=%'\n"+string.digits
#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-,.!? :;\"'@&()+=%'\n0123456789
def get_key(i,j):list = []for a in dictionary:for b in dictionary:if ord(a) ^ cipher[i] == ord(b) ^ cipher[j]:list.append(chr(ord(a) ^ cipher[i]))return list
for length in range(2,28):key=""group_nums=len(cipher)//length-1 #分组长度,若取len(cipher)//length,有可能会超出下面的运算范围。这里再减一即可,因为概率很大。for i in range(length):keylist=[]for j in range(group_nums):keylist=keylist+(get_key(j*length+i,(j+1)*length+i))key+=''.join(collections.Counter(keylist).most_common(1)[0][0])#采用collections.Counter().most_commom取出出现次数最多即概率最大的字符为flagprint(key)

可以把key和密文再次放入enc函数中求出poem来验算

#xor_is_interesting!@#
flag="xor_is_interesting!@#"
def enc(data, key):key = (key * (len(data) // len(key) + 1))[:len(data)]return strxor(data, key)
with open(r"D:\Mango\\xorgame\\reverse.txt",'w')as r:r.write(str(enc("".join(list(map(chr,base64.b64decode(s)))).encode(),flag.encode())))r.close()f.close()

reverse.txt

b’\nLife, thin and light-off time and time again\nFrivolous tireless\none\nI heard the echo, from the valleys and the heart\nOpen to the lonely soul of sickle harvesting\nRepeat outrightly, but also repeat the well-being of\nEventually swaying in the desert oasis\nI believe I am\nBorn as the bright summer flowers\nDo not withered undefeated fiery demon rule\nHeart rate and breathing to bear the load of the cumbersome\nBored\nTwo\nI heard the music, from the moon and carcass\nAuxiliary extreme aestheticism bait to capture misty\nFilling the intense life, but also filling the pure\nThere are always memories throughout the earth\nI believe I am\nDied as the quiet beauty of autumn leaves\nSheng is not chaos, smoke gesture\nEven wilt also retained bone proudly Qing Feng muscle\nOccult\nThree\nI hear love, I believe in love\nLove is a pool of struggling blue-green algae\nAs desolate micro-burst of wind\nBleeding through my veins\nYears stationed in the belief\nFour\nI believe that all can hear\nEven anticipate discrete, I met the other their own\nSome can not grasp the moment\nLeft to the East to go West, the dead must not return to nowhere\nSee, I wear Zan Flowers on my head, in full bloom along the way all the way\nFrequently missed some, but also deeply moved by wind, frost, snow or rain\nFive\nPrajna Paramita, soon as soon as\nlife be beautiful like summer flowers and death like autumn leaves\nAlso care about what has’

参考文章:

https://blog.csdn.net/qq_51999772/article/details/123472212

https://igml.top/2018/11/13/2018-HCTF/

https://blog.csdn.net/qwe1257/article/details/83272340

hctf-2018-Crypto-xorgame相关推荐

  1. [HCTF 2018] WarmUp

    [HCTF 2018] WarmUp 开局一张图,先看看页面源码信息 给出了一个 source.php 应该是后端的源码,这题代码审计了 <?phphighlight_file(__FILE__ ...

  2. [原题复现]HCTF 2018 Warmup

    HCTF 2018 Warmup 原题复现:https://gitee.com/xiaohua1998/hctf_2018_warmup 考察知识点:文件包含漏洞(phpmyadmin 4.8.1任意 ...

  3. BUUCTF [HCTF 2018]WarmUp 1

    BUUCTF [HCTF 2018]WarmUp 1 f12发现提示source.php 打开后发现php代码: <?phphighlight_file(__FILE__);class emmm ...

  4. [HCTF 2018]Hideandseek

    知识点:flask-session伪造,文件读取,mac地址查询 文章目录 解题过程 1. 注册用户并登录 2. 文件读取 2.1 读取/proc/self/environ 2.2 读取/app/uw ...

  5. 记[HCTF 2018]Hideandseek

    记[HCTF 2018]Hideandseek 前言 一万年没刷题了,尽搞些杂七杂八的了,于是乎刷了一个题(自己给自己一个嘴巴子) 总结一下这个题的考点: zip 软链接实现任意文件读取 linux系 ...

  6. BUUCTF [HCTF 2018] Hide and seek

    BUUCTF [HCTF 2018] Hide and seek 考点: 软连接读取任意文件 Flask伪造session /proc/self/environ文件获取当前进程的环境变量列表 rand ...

  7. BUUCTF:[HCTF 2018]Hide and seek

    BUUCTF:[HCTF 2018]Hide and seek 参考:https://www.jianshu.com/p/d20168da7284 先随便输入账号密码登录 提示我们上传zip文件 上传 ...

  8. BUUCTF [HCTF 2018] admin

    BUUCTF [HCTF 2018] admin 解法一:弱密码 解法二:Flask伪造Session 解法三:Unicode欺骗 考点: 弱密码 Flask伪造session Unicode欺骗 启 ...

  9. BUUCTF-WEB:[HCTF 2018]WarmUp

    刷题平台:https://buuoj.cn 题目地址:https://buuoj.cn/challenges#[HCTF%202018]WarmUp 解题步骤: 1.访问:http://26778d3 ...

  10. [HCTF 2018]admin

    前言: 最近在BUUCTF刷题,参照师傅们wp后复现一下 0x01 拿到题目后进去如下界面 发现有登录和注册界面,想必是要登录后才能查看想要的信息. 查看页面源代码,看看有没有上面提示,界面如下 提示 ...

最新文章

  1. (正)斜杠 与 反斜杠
  2. PTA浙大版python程序设计题目集--第3章-5 字符转换 (15 分)
  3. GDCM:获取dicom文件Sequence的长度的测试程序
  4. 我常用的10个Python实用小Trick
  5. 最优化作业02—一维最优化方法
  6. iOS开发网络篇—Reachability检测网络状态
  7. 八、JQurey总结
  8. spark视频-Spark on Yarn
  9. Adobe 修复严重的 Photoshop 缺陷
  10. c++ opencv 照片清晰度_PS教程:旧照片翻新修复技巧
  11. 视频转换器如何将视频MKV转换成MP4格式
  12. 如何删除档案中的重复的行
  13. CloudStack + KVM + HA
  14. 三斜线表头表格HTML,excel三栏斜线表头的完美制作方法
  15. 【C++初阶学习】之 懒人神器——模版(概念)
  16. 设计模式学习之访问者模式
  17. 友盟推送成功但是收不到
  18. 爬虫训练场项目前端之 Bootstrap 信息提示框,按钮与按钮组,徽章,进度条
  19. 享受还是行走,这是一个问题。
  20. java.lang.IllegalStateException: getWriter() has already been called for this response问题解决

热门文章

  1. 【转载】如何从win8/8.1中文版(核心版)升级到win8/8.1专业版
  2. 各种Hash函数和代码
  3. IOC BeanFactory XML之旅
  4. 数学模型转化为计算机语言,程序设计语言类课程教学选题方法探讨
  5. 阿里云天池机器学习task3
  6. Java去除首尾指定字符串
  7. Excel 条件格式查重问题
  8. CSS前端样式美化总结
  9. 推理悬疑侦探小说大全合集隐私政策
  10. mysql数据库查询工具''_数据库查询工具