编写的项目文件请参考项目链接。同时欢迎大家访问ACTF2020的所有赛题。喜欢的话请多多资瓷一下,给我们实验室的项目加个Star或者Fork,谢谢。
为了保护服务器的同时不给选手带来更多困难,密码学部分的交互题开了pow算力检测,我也提供了相应的pow算力运算解决样例,大家下载即可。
入门题
Column Permutation Cipher:
简单的矩阵换位密码,首先统计字段长度为625,由于题目中告诉我们是m*n矩阵换位,所以m,n的可能值是(5,125),(25,25),(125,5),然后爆破即可,示例脚本:
1 | #-*- coding=UTF-8 -*- |
我的密码本:
统计英文文本中每个字符的出现频率,并查找概率表进行对比。当然其中需要用到一些英文知识,一般这种题目语义都是连贯的,一定要注意最后解出来的明文语义上是否通顺。
如果你统计好词频并确定了明文-密文对以后,即可还原出原文。
1 | code_book="ㅡ贰ㅒㄱёㄴ伍ㅊあムг肆ンㅇэ叁йΣωθξ壹ㅣのл¥" |
简单题
bomb or boom:
题目给出了5个压缩包文件和一个密码本,并告知我们5个压缩包只要破解4个就行。所以应该涉及到门限方案,这里虽然没有题目名,但是hint中给出来了,用的是bloom门限。这是一个(4,5)门限,消息被5个随机模数求模,得到ai和mi。并被封装在五个压缩包中。
压缩包的密码被一些编码方式加密了,想了解这些编码方式请看这里。
下面稍微解释一下这些有趣的编码,第一个是培根,第二个盲文,第三个用的是千千秀字的文本转音符(大可搜索一下,如何把文本加密为音符,仅此一家,ps.看着音符的样子难道不好看嘛),第四个是aaencode(学过web应该都知道的吧),第五个是brainfuck,参考一下资料即可。
然后用门限方案的脚本直接跑,就可以辽:
1 | import math |
运行结果:
naive encryption:
一道改装后的仿射密码题,只不过采用了不同的a,b进行了更多的轮加密,所以说这道题目更像是算法逆向。关键知识是乘法逆。解题脚本如下:
1 | from Cryptodome.Util.number import * |
naive rsa:
本来这道题目我已经出好推送想送分的,但不料推送还没轮到我,所以没发出来,希望大家多多支持“中南极光网安实验室”的公众号,支持痛并快乐着的作品。
回到题目,这是一道简单的coppersmith,主要问题出在getPrime函数和给出的p%q上。p是520位素数,q是500位素数,所以p//q就在219到221之间,我们假设p//q=k,p%q=a,那么p=kq+a,那么我们只需要在219到221之间爆破k即可,脚本如下:
1 | import gmpy2 |
中等题
Imitation game:
由于在密码学实验期间,我发现基本没有同学完成mtp的实验,所以在这里稍微加深了一下mtp以后形成了新的题目。这道题目和一般的mtp的区别就是,这里对密钥进行了类似于CBC的块加密,代码如下:
1 | def encrypt(iv,message): |
但是由于初始iv范围很小,而且它嵌入到了密钥的每一个字节中,所以我们只需要爆破iv就可以得到明文。甚至我们可以知道密钥最后一位是”}”,直接与mtp后得到的密钥异或就知道iv值了。然后整个密钥每个字节异或iv就得到明文。
而对于mtp,题目中已经给出,密文都来自于书本原句,即可见字符,那么我们只需要通过限定课件字符的范围就可以排除很多无关答案。这里推荐python的mtp包,效果很棒,运行截图如下:
得到的key不是最后的key,但是0xd6^b’}’=0xab,所以对每一位异或0xab即可得到明文。
naive aes:
又是一道算法逆向题,但是这里主要考察的是S盒和P盒的逆向。
from: nactf——Super Duper AES
writeup: detail link
all you need is to:
1.Reverse the permute() function.
2.Reverse the substitute() function.
3.Put everything together and run the script.
Isn’t it easy?
tiny_PRNG0:
出题人:DJ
出题人只给了我脚本,不过mt19937伪随机数预测最近的CTF题目很多,大家可以参考这个博客。
基本思想:根据输出的随机数逆向extract_number对应的状态,实际上只需要前624个随机数恢复前624个state,就可以预测此后生成的随机数。 脚本:
1.mt19937.py
1 | #!/usr/bin/env python3 |
2.exp.py
1 | #!/usr/bin/env python3 |
难题
DLP头号玩家:
这道题主要是想考察离散对数问题,设计的考点有:如何计算离散对数,ElGamal算法,ecc算法。
level1:计算离散对数
采用大步小步法即可。
level2:ElGamal算法
首先,这里的密钥是两个字节的(见下面代码),可以直接考虑爆破:
1 | d=bytes_to_long(message[0:2]) |
然后根据密钥进行ElGamal算法解密即可。
level3:ECC算法
先回顾一下ECC算法
这里我在具体代码中做了一些手脚,令k=100,d=100,把100当成常量嵌入到了kG的运算中,所以其实解密的时候只需要代入d=100,k=100即可。
解题脚本示例如下(省略交互):
1 | from math import ceil,sqrt |
tiny_PRNG1:
出题人:DJ
主要是对xoroshiro128plus随机数发生器,参考资料
需要对next函数进行逆向,然后用z3求解种子。
直接放解题脚本:
1 | #!/usr/bin/env python3 |
- 文章链接: https://life-extension.github.io/2020/06/05/ACTF2020密码学部分writeup/
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处!
-
通过python脚本自动插入汇编反调试代码
五月 20日, 2020
研究背景在之前OLLVM项目的研究过程中,我们发现反调试技术对反混淆脚本有一定的干扰作用,如果可以在OLLVM的中间代码中自动化插入反调试代码,那么就可以给OLLVM的代码混淆增加一层保障。 方案分析探讨多种方案以后,我认为最适合在汇...
-
基于门限方案的条形码保密及容错技术
四月 30日, 2020
关键词:门限方案,条形码保密,条形码容错,条形码认证与防伪造。 经历过初期两个小项目的探索,我们项目团队积累了一定的项目研究经验,在老师和16级学长的帮助下,我们把研究方向转到了门限方案的实际应用上。结合市面上用9张合并的条形码提高条...
-
2020新年原创脚本-其中的小把戏你清楚吗
四月 26日, 2020
关键词:随机数素数生成,新年祝福小程序。 脚本创作这是我在大年三十写的一个程序,当时我正准备去伯克利交流,但由于疫情的缘故,出国变数增大,所以我就打算通过随机数“未卜先知”。以下就是我的脚本: 12345678910111213141...
-
基于CRT的物流信息安全处理方案
四月 15日, 2020
关键词:中国剩余定理,密钥分发技术,隐私保护。 引言在2018年11月份的时候,段老师在密码学课上讲到了密钥分发协议,我当时就觉得这个协议很有意思也很有应用前景。后来老师还很主动地分享了一下它的idea,其中一部分就是有关物流单上的信...
-
基于CRT的新型群文件共享系统
四月 13日, 2020
关键词:隐私保护,权限管理,身份认证,中国剩余定理,密钥分发,密钥更新。 这个项目的是在2019年寒假期间进行的,4月份在中南大学信息安全作品赛答辩,但是由于功能只实现了主体部分,加之我在台上比较胆怯紧张,所以只获得团队三等奖,但是当...
-
安卓反混淆软件探索-deobf
三月 19日, 2020
关键词:代码混淆,代码反混淆及其原理,代码反混淆软件测试与性能对比。 前言我们的大创项目其实是分两方面进行的,一方面,我们从代码混淆的角度比较各种软件对安卓程序的加固能力;另一方面,我们着重针对OLLVM进行反混淆测试。OLLVM集成...
-
记一次安卓代码加固软件的测试过程
三月 13日, 2020
关键词:代码加固,软件测试,原理分析,过程分析。 在大创项目的实践中,我们对市面上的一些安卓代码加固软件进行了采集,经过搜集,发现了几类代码加固方法并分组进行研究。我发现很多代码加固软件都是对java字节码进行混淆与加固,另外一些则选...
-
OLLVM代码加固机制分析
二月 24日, 2020
我们通过自己编写测试代码,再用OLLVM的不同指令进行加固,并逆向查看加固效果,加深对代码加固机理的了解。OLLVM目前提供的功能包括控制流平坦化(fla指令),指令替代(sub指令),代码虚拟化(bcf指令)以及虚假控制流(obf指...
-
对音频缓存加密的探讨
二月 17日, 2020
关键词:缓存解密,批量自动执行脚本,版权保护相关建议。 前段时间,某音乐被爆其缓存文件只使用了简单的异或加密,且容易得到加密密钥为0xa3。原文链接点击这里。以下是我的延伸探讨。 1.对音频缓存的批量解密攻击抱着好奇的心理,我把手机...