题目描述:
Check out our brand-new cipher. It’s super-fast and moderately secure.

#!/usr/bin/python
import struct
import osM = 65521
class LCG():def __init__(self, s):self.m = M(self.a, self.b, self.state) = struct.unpack('<3H', s[:6])def round(self):self.state = (self.a*self.state + self.b) % self.mreturn self.statedef generate_gamma(self, length):n = (length + 1) / 2gamma = ''for i in xrange(n):gamma += struct.pack('<H', self.round())return gamma[:length]def encrypt(data, key):assert(len(key) >= 6)lcg = LCG(key[:6])gamma = lcg.generate_gamma(len(data))return ''.join([chr(d ^ g)  for d,g in zip(map(ord, data), map(ord, gamma))])def decrypt(ciphertext, key):return encrypt(ciphertext, key)def sanity_check():data = 'A'*100key = os.urandom(6)ciphertext = encrypt(data, key)decrypted_data = decrypt(ciphertext, key)assert(data == decrypted_data)if __name__ == '__main__':with open('flag.png', 'rb') as f:data = f.read()key = os.urandom(6)enc_data = encrypt(data, key)with open('flag.enc.bin', 'wb+') as f:f.write(enc_data)

本题给出了一份python加密程序的源码和一个密文文件,需要通过源码逆向出密钥key来破解以获得flag。
解题的关键点如下:

1、通过加密文件名flag.png.bin可知原文件为png图片,从而可知明文的前8个字节为0x89504E470D0A1A0A,即png图片的固定文件头。而密文的前8个字节为0x5FC79CA8BCE94A78。这两组8字节是逆向出密钥key的基础。

2、加密过程实际是一个XOR过程,在破解出密钥key后,只需利用原加密程序重新XOR一次即可,无需自行编写程序。

3、理解python的struct库的pack和unpack函数。Struct库是python用来解析数据的工具:

struct.pack(‘H’, x)表示(H前有个<符号,不知为啥就是显示不出来?),将x按照H格式,以小端优先的规则解析。其中,H表示无符号短整型(两字节),网上有完整的类型表,可查阅;而“<”表示little-endian,即小端优先。举例如下:

gamma = struct.pack('<H', 38870)#38870的16进制为97d6print "gamma : ", binascii.b2a_hex(gamma)#结果为d697

struct.unpack(‘<3H’, x)表示,将x以小端优先的规则还原成H格式,结果以tuple形式输出。其中,3表示需还原3个无符号短整型(相当于6字节)。举例如下:

p = struct.unpack('<3H', "0d1d0a") #共分成三个元素,即0d、1d、0a,每个元素按照小端优先(即d0、d1、a0)的原则还原为H格式print p #结果为(25648,25649,24880),相当于16进制的(6430,6431,6130),即(d0, d1,a0)

4、加密程序本质上就是,将明文数据与通过密钥key生成的gamma字符串按字节XOR得到密文,而gamma字符串的计算过程可简写为:

self.state = (self.a*self.state + self.b) % self.m (*)
n = (datalength + 1) / 2
gamma = ''
for i in xrange(n):gamma += struct.pack('<H', self.state)

其中,m是常数65521。a、b和state是6字节密钥key通过struct.unpack(‘<3H’, x)获得的三元tuple,而state会根据(*)式迭代更新,每一轮的state会带入下一轮的计算。

同时,尽管n仅为明文数据长度的一半,但由于struct.pack解析出的数据均为H格式(双字节),故gamma的长度与明文长度是一致的。

5、根据1可知,gamma字符串的前8字节为明文与密文的XOR结果:
明文:0x89504E470D0A1A0A
密文:0x99CE83E95DE0D8E0
Gamma:0x109ecdae50eac2ea
故可得下面等式:
65521 * x + 40464 = a * s + b (40464即109e的小端优先9e10的对应整数)
65521 * y + 44749 = a * 40464 + b (上一轮的余数40464作为s带入下一轮)
65521 * z + 59984 = a * 44749 + b
65521 * w + 60098 = a * 59984 + b
从而可得:
65521 * (w-z) + 114 = a * 15235
又知a的取值范围为(0,65535),可通过以下代码爆破出a,计算可得唯一解a=44882。
同理可得b=50579,s=37388。

for a in range(0, 65535):tmp = a * 15235 - 114if tmp % 65521 == 0:print "a : ", a

6、由a、b、s,根据struct的规则可得:
a=44882->AF52->52AF
b=50579->C593->93C5
s=37388->920C->0C92
密钥key为:52AF93C50C92
带入原加密程序即可还原图片得到flag。

Flag:{linear_congruential_generator_isn’t_good_for_crypto}

VolgaCTF2015之lcg的writeup相关推荐

  1. 祥云杯2022 writeup

    0x01 web 1.ezjava 下载源码对jar文件进行反编译,发现POST /myTest会出现反序列化漏洞 util ,最后好像没用到 检查程序,发现apache的common−collect ...

  2. 2021年中国工业互联网安全大赛核能行业赛道writeup之usb流量分析

    目录 一.USB协议 二.键盘流量 三.鼠标流量 四.writeup 附件题:usb流量分析 题目描述: 具体描述忘记了o(╯□╰)o 大概意思是有个U盘插到电脑上,然后经过一些操作导致该电脑重启了. ...

  3. 2021年中国工业互联网安全大赛核能行业赛道writeup之鱿鱼游戏

    目录 一.尝试 二.Writeup 附加题 鱿鱼游戏(来自最近一部很火的韩剧) 题目描述: 小王由于操作不规范,误将不明U盘插入到上位机中,导致上位机中的某些关键文件被加密,但攻击者在U盘中还留下了一 ...

  4. 2018湖湘杯海选复赛Writeup

    2018湖湘杯Writeup 0x01 签到题 0x02 MISC Flow 0x03 WEB Code Check 0x04 WEB Readflag 0x05 WEB XmeO 0x06 Reve ...

  5. php upload ctf,强网杯CTF防御赛ez_upload Writeup

    这是强网杯拟态防御线下赛遇到的web题目,本来是不打算分享Writeup的,但是由于问的人很多,于是这里分享给大家. ez_upload这题算是非常经典的堆叠black trick的题目,算是比较典型 ...

  6. 安恒赛php_安恒11月月赛周周练writeup

    前言 11月月赛 完美错过时间,正好有周周练,基本都是一样月赛的web,记录下write up 手速要快 这题是10月月赛中的一题,直接看我上次的writeup:安恒月赛(十)web-2题writeu ...

  7. 南京邮电大学网络攻防训练平台(NCTF)-异性相吸-Writeup

    南京邮电大学网络攻防训练平台(NCTF)-异性相吸-Writeup 题目描述 文件下载地址 很明显,文件之间进行亦或就可得到flag,不再多说,直接上脚本 1 #coding:utf-8 2 file ...

  8. 社团的CTF逆向题WriteUp

    最近社团弄了CTF比赛,然后我就帮忙写了逆向的题目,这里写一下WriteUp,题目和源码在附件中给出 一个简单的逆向:one_jmp_to_flag.exe 这题算是签到题,直接OD智能搜索就完事了, ...

  9. CTF-i春秋网鼎杯第一场misc部分writeup

    CTF-i春秋网鼎杯第一场misc部分writeup 最近因为工作原因报名了网鼎杯,被虐了几天后方知自己还是太年轻!分享一下自己的解题经验吧 minified 题目: 一张花屏,png的图片,老方法, ...

最新文章

  1. H3C 7506E基于时间的分时段上网的ACL
  2. TensorFlow学习笔记(二十八)CNN的9大模型之AlexNet
  3. gcc编译c文件的简单操作
  4. 什么可以搜python答案_超星Python程序设计答案章节测试答案免费,能搜索网课答案的公众号...
  5. Kubernetes的拐点助推器:左手开源,右手边缘计算
  6. NSDictionary使用枚举方法
  7. ubuntu 12.04 ubuntu System program problem detected 解决方法
  8. 数据分析看关晓彤的招黑之路
  9. UBUNTU设置环境变量MALLOC_CHECK_=1检查内存
  10. 8款最受欢迎的HTML5/CSS3应用及源码
  11. 思特威电子通过注册:拟募资28亿 小米红杉联想是股东
  12. HFSS - 圆形双馈微带天线
  13. 手机邮箱服务器设置安全类型,手机邮箱设置
  14. Java的加减乘除方法
  15. Electron播放 RTMP流 实现
  16. 微信软文的作用说到底就是营销的一种手段
  17. 教学教法改革效果评估的4种方法
  18. Vue3中使用Vform3(自定义表单工具)
  19. 得到一个数每一位数字的几种方法
  20. 单片机智能小区安防系统

热门文章

  1. 单片机,51红外通信代码,详细注释【普中科技】【350行】【原创】
  2. STM32 FSMC接口驱动4.3寸TFT LCD屏
  3. r语言怎么做经验分布_训练宝宝语言能力应该怎么做
  4. AI把你打造成时尚界宠儿
  5. C语言捉弄人的程序,愚人节怎么捉弄人?愚人节微信红包整人方法大全
  6. Tesla AI Day:特斯拉如何实现自动驾驶的详解
  7. 如何解决hbase中数据热点问题
  8. 恩科迪亚Encodya for mac(单机游戏)
  9. 独家 | 离开百度后,王劲创办的景驰将于2020年6月量产自动驾驶汽车
  10. hdu 4405 全期望公式