NSCTF &SteinsGate&详细writeup

NSCTF "SteinsGate"详细writeup

From ChaMd5安全团队核心成员 sherlly

0x00 前言

挺不错的一道题,思路值得学习,所以简单记录下。

0x01 恢复文件

查看文件头为PK,改后缀名为zip,解压得到三个文件,分别是

  • flag.enc:加密后的flag
  • encryption:加密算法脚本
  • 一段base64:解码后转二进制文件,查看文件头JFIF,为图片(DivergenceMeter.jpg)

0x02 读加密算法逻辑

算法逻辑主要可分为两部分:

1.对t0的求解。

其中t0的值和操作系统平台(Windows/Linux/Darwin),字长位数(32/64),当前用户uid,随机小数r(范围0-2,且最多6位小数),m的md5值有关。

这里还可以知道t0的位数应该在48左右(5+2+2+7+32)

2.对t1的求解及使用

t1的值由flag的值和t0异或得到(位数也在48左右),之后算法使用了给的图片文件(DivergenceMeter.jpg),在文件中找和t1各个字符(t1[i])相同的值img[k],并提取索引值k,转换为字符(k与255取模保证在ascii码范围内),遍历t1生成表l,l的结构大致如下:

得到表l后,纵向遍历该表,并把读取数据写入result,最终得到加密后的flag文件flag.enc。

0x03 恢复t1

由上述逻辑可知,突破点在flag.enc,假设t1取48位,则flag.enc的前48位应该是t1[i] (i=0,1,…,47)的第一个元素,即chr(k1),因此可以通过遍历图片文件,将t1的值扩大到包含所有字符(256个)的类表l的索引表table:

得到表table后,遍历该表的table[i][0]查找和flag.enc的前48位(记为head)分别相同的索引值转ascii并记录,得到t1

这里有个问题,存在多个table[i][0]和head[j]相同的情况,因此还要判断table[i][1]的情况。打印出几个值判断下:

由于t1位数限制关系,因此table[i][1]应该和table[i][0]距离不远,在文件中查找,基本可以确定A9是t1构成的表l[0][1],因此确定了i,从这里也可以得到t1的实际位数应该是45位,之后的写个代码取flag.enc的46位开始和table[i][1]判断下就可以,具体看最后的代码实现部分。

0x04 恢复t0

上一步中得到了t1,因此这一步主要是通过以下几方面确定t0的值:

1.确定操作系统及字长位数

根据题目提示,flag.txt中含完整flag,也就是说前几位为’flag{‘,将已知的flag与t1异或得到t0的头几位为’Darwi’,基本确定操作系统为’Darwin’,又因为python文档中写明若为该类型时机器为64位,故得到t0的前8位为’Darwin64’。

2.确定32位md5值

根据题目提示,flag的最后一位应该是’}’,因此md5的最后一位与t1的最后一位异或得到的值应该是’}’,运算得知为’e’,即得到的md5最后一位应该是’e’

m的前几位已知为‘64bit’,开始爆破uid和r1,r1由已知应该是1到3位,uid的位数可以通过t0确定(由于t0为45位,r最少为1位,可以算出uid位数应该在1-4之间[1,45-8-32-1])

写脚本爆破并对求得的符合要求的md5值(末位为’e’)与t1的末32位异或,找到符合要求的部分flag(只含字母、数字、’_’、’}’)

得到部分flag:’ce_0f_st3ints_G4t3_1p048596_233}

对应md5值为afe46f1497072540f60d793e1e5a2a6e,uid为520,r1为125

3.确定r值

由上述uid的值可以确定r的位数应该为2(45-8-32-3),注意到r的第一位不是0就是1,写脚本爆破并组合成最终的t0和t1进行异或,打印出符合要求的flag(只含字母、数字、’_’、’{‘,’}’)。 这里有个问题,uid为520时打印出的flag为flag{to7^im91ce_0f_st3ints_G4t3_1p048596_233},改了uid为420才输出成功。

最终t0:Darwin6442000afe46f1497072540f60d793e1e5a2a6e

最终flag:flag{to7_im91ce_0f_st3ints_G4t3_1p048596_233}

0x05 解密脚本

(微信对图片的压缩实在令人厌烦,建议在手机端观看)


原文发布于微信公众号 - ChaMd5安全团队(chamd5sec)

原文发表时间:2017-07-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

做到这二十条,Python程序性能轻松翻倍!

1.优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的...

38670
来自专栏游戏杂谈

使用phpexcel操作excel

使用这个组件最让我郁闷的是,它对sheet的名称为中文的不进行处理,暂时还没仔细去查原因。

38020
来自专栏CDA数据分析师

工具 | 很全的 Python 面试题

Python语言特性 1 Python的函数参数传递 看两个例子: ? 所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。 ...

1.4K90
来自专栏从零开始学自动化测试

pytest文档9-参数化parametrize

这将运行测试,参数设置为x=0/y=2,x=1/y=2,x=0/y=3,x=1/y=3组合参数。

20020
来自专栏瓜大三哥

UVM(八)之transaction及field_automation

UVM(八)之transaction及field_automation uvm_sequence_item派生自uvm_transaction,...

27280
来自专栏生信宝典

Bookdown文档生成教程

bookdown是一款及其方便的编写技术文档或教材的工具,语法简洁,数据处理灵活。支持Rmarkdown或普通markdown通过pandoc软件转换为HTML...

67850
来自专栏Java架构沉思录

伪共享和缓存行填充,Java并发编程还能这么优化!

关于伪共享的文章已经很多了,对于多线程编程来说,特别是多线程处理列表和数组的时候,要非常注意伪共享的问题。否则不仅无法发挥多线程的优势,还可能比单线程性能还差。...

14820
来自专栏用户2442861的专栏

2014网易实习生招聘面试题

http://blog.csdn.net/silangquan/article/details/18969875

22010
来自专栏编程

PHP中性能优化之生成器

问题背景 PHP生成器是PHP的5.5.0版本引入的功能,生成器实际上就是简单的迭代器。生成器会根据需求计算产出迭代的值,而标准的PHP迭代器经常在内存中执行迭...

24190
来自专栏生信宝典

ETE构建、绘制进化树

ETE能做什么 A Python framework for construction, analysis and visualization of trees...

87350

扫码关注云+社区

领取腾讯云代金券