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查找某一个元素的...

3617
来自专栏游戏杂谈

使用phpexcel操作excel

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

2272
来自专栏xingoo, 一个梦想做发明家的程序员

Elasticsearch——Rest API中的常用用法

本篇翻译的是Elasticsearch官方文档中的一些技巧,是使用Elasticsearch必不可少的必备知识,并且适用于所有的Rest Api。 返回数...

2087
来自专栏Jerry的SAP技术分享

给广大码农分享福利:一个业界良心的github仓库,中文计算机资料

我今天查资料时无意发现的,https://github.com/CyC2018/CS-Notes

3332
来自专栏吴伟祥

为什么计算机最小的存储单位是字节?而最小到的传输单位是bit?

数据存储是以“字节”(Byte)为单位,数据传输是以大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b...

1.1K2
来自专栏JackeyGao的博客

Django小技巧22: 设计一个好的模型

本篇将分享一些技巧,用户改进 Model 的设计。其中有很多与命名约定有关, 这可以大大的提高代码的可读性。

1302
来自专栏瓜大三哥

UVM(八)之transaction及field_automation

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

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

pytest文档9-参数化parametrize

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

1702
来自专栏用户2442861的专栏

2014网易实习生招聘面试题

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

1731
来自专栏生信宝典

ETE构建、绘制进化树

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

6735

扫码关注云+社区