查看原文
其他

看雪.京东 2018 CTF 第四题点评与解析

看雪CTF 看雪学院 2019-05-27


周末快乐~一周已经过去,CTF比赛也已经进行到了第五题。

在刚刚结束的第四题中,共有30人攻破~


各路英雄一路奋战,战况如下:


前三名依然稳如泰山




看雪版主&评委 netwind 点评


作者主要通过密码学算法来对序列号进行验证,并对AES算法加入了花指令。通过爆破AES密钥未知位,得到完整密钥后就可以得到序列号的前一部分,同时由于题目中RSA算法里面的参数n可被分解,可以解密RSA加密的字符串,从而得到序列号后面的部分,最后得到答案。此题有助于理解逆向领域密码学算法相关知识。



看雪.京东 2018 CTF 第四题 作者简介


大帅锅

bbs.pediy.com/user-759174

第四题出题者简介:

郑维明,男,四川遂宁人 ,2018年6月16日毕业于西南科技大学 ,生物工程+计算机科学与技术专业,2017年接触看雪论坛发现里面群英荟萃、高手如云,是一个能让你成长很快的地方,从此便爱上这个论坛。爱好:逆向,数学,唱歌,跳舞。




看雪.京东 2018 CTF 第四题 设计思路


考察点:

1、RSA算法

2、AES算法

3、 以及简单的花指令


程序对已知明文(包括RSA的n,已知aes后13位)都进行简单加密。

加密算法为:


void str_decode(char *str){

    int j = 1;

    for (int i = 0; i < strlen(str); i++){

        str[i] = str[i] ^ j;

        j++;

    }

}


程序运行将创建子进程kill父进程。



子进程为主要进程。


Serial 分两部分。前3字节用于AES 后面用于RSA


注册码Serial=”520iamahandsomeguyhaha1”

 

 

程序运行中还有一个只有子进程才能触发的flag与serial[3]相加才能得aes的密钥

 

1.程序中在main函数和中插入了str_decode函数中和RSA,AES算法处插入了少量花指令。


花指令采用形式:


第一类:

jb Lablel

jnb Label

db E8(E9)

 Label: 代码


第二类:

                   calls2

                   __emit0e8h

         s1:

                   jmps3

                   __emit0ebh

                   __emit00h

         s2:

                   calls1

         s3:

                   addesp,8


2.手工修改了main函数


手工修改代码处为:



将main函数的403130-403133 处的汇编代码移植到此处。分析者需正确识别去掉简单的花指令方能显现正确逻辑。

 

00403130 >  55              push ebp

00403131   8BEC            mov ebp,esp

00403133   83EC 7C         sub esp,0x7C

00403136   53              push ebx

00403137   56              push esi

00403138   57              push edi

00403139   8D7D 84         lea edi,dword ptrss:[ebp-0x7C]

0040313C   B9 1F000000     mov ecx,0x1F

 

RSA n 采用 msieve 分解用时2分钟

 


爆破aes:1000位数字只需0.003秒

 


# -*- coding: utf-8 -*-

import sys

import time

from Crypto.Cipher import AES 

from binascii import b2a_hex,a2b_hex 

  

class prpcrypt(): 

         def__init__(self, key): 

                   self.key= key 

                   self.mode= AES.MODE_ECB 

         defencrypt(self, text): 

                   cryptor= AES.new(self.key, self.mode) 

                   length= 16 

                   count= len(text) 

                   if(count% length != 0) : 

                            add= length - (count % length) 

                   else: 

                            add= 0 

                   text= text + ('\0' * add) 

                   self.ciphertext= cryptor.encrypt(text)  

                   returnb2a_hex(self.ciphertext) 

      

         defdecrypt(self, text): 

                   cryptor= AES.new(self.key, self.mode) 

                   plain_text= cryptor.decrypt(a2b_hex(text)) 

                   returnplain_text.rstrip('\0') 

  

if __name__ == '__main__': 

         start_time=time.clock()

         hash='912ca2036a9a0656d17b6b552f157f8e'

         key='1314000000000'

         fori in range(999):

                   i_=str(i)

                   iflen(i_)==1:

                            i_='00'+i_

                   iflen(i_)==2:

                            i_='0'+i_

                   pc= prpcrypt(i_+key) #初始化密钥 

                   d= pc.encrypt("pediy")

                   ifd==hash:

                            printi_

                            printi_+key

                            break

         print"time=%.3f" %(time.clock()-start_time)


程序采用vc编译。




看雪.京东 2018 CTF 第四题解析



*本解析来自看雪论坛 iweizime 


常规做法,拿到程序后,拖到IDA Pro,由于没有壳,可以找到许多有用的信息。使用findcrypt-yara插件,可以找到AES算法中使用到的常数。再查看一下字符串,可以确定使用了MIRACL库。

 

用条件跳转指令对main函数的入口做了一点混淆,手动改好即可。


 

为了更好的利用IDA Pro的反汇编功能,可以使用keypatch插件将main函数的入口修复的一下。


 

在其他的地方,使用call指令进行了混淆,例如 0x00402580 出的函数,同样的,修复一下。就可以用F5了。




我们可以做的更好,使用nop将这一段垃圾指令清楚掉,然后用F5。



利用这个函数,可以解析出一些字符串。


serial:

success

error

912CA2036A9A0656D17B6B552F157F8E

0001314000000000

208CBB7CD6ECC64516D07D978F5F0681F534EAD235D5C49ADD72D2DB840D5304

7da39de66016477b1afc3dc8e309dc429b5de855f0d616d225b570b68b88a585


剩下的工作就没有什么技巧可言了,对照MIRACL库,将用到的函数标注出来,可以发现其验证流程。

 

验证分为两部分,输入的前三个字符,作为AES密钥的一部分,使用ECB模式,加密字符串pediy(需要补0),其结果与912CA2036A9A0656D17B6B552F157F8E 对比。

 



上图中arg0即为输入的前三个字符,有一个全局变量dword_495728不用管他,反正密钥本身也需要破解三个字符。爆破出来密钥是5211314000000000。所迷密钥的前三个字符为52#,#不确定。

 

剩下的字符,先做一个hex编码,然后变成一个大整数,用RSA来验证




n可以使用factordb.com分解


p =  208096057845685678782766058500526476379

q =  273086345401562743300402731618892888991


然后可以通过RSA解密出来明文为69616d6168616e64736f6d656775796861686131。hex解码一下就是iamahandsomeguyhaha1。

 

所以flag为520iamahandsomeguyhaha1。其中第三个字符一猜就是'0'啦。

 

做这个题需要找出使用的库,否则去逆库函数的话,需要花的时间太多了。

 

美男子,惹不起,惹不起O(∩_∩)O



CTF 寄语


netwind

bbs.pediy.com/user-39732

netwind:

2017年,看雪.Wifi万能钥匙 2017CTF年中赛和看雪.TSRC 2017CTF秋季赛连续成功举办,目前看雪CTF竞赛已经是国内逆向领域最专业、影响力最广的赛事。2018年,看雪CTF竞赛即将拉开序幕。本届大赛将依然严格按照竞赛规则进行,保证大赛的公平、公正、公开。


瑾代表看雪2018CTF大赛组委会并以大赛评委的名义对所有参加比赛的选手表示热烈的欢迎!相信所有参赛选手都会有不一样的收获,相信此次大赛会因你们精湛的技术而变得分外精彩!再此特别感谢所有关注、支持和帮助大赛的各界朋友,也希望大家持续关注和支持看雪CTF大赛!


我们希望能有更多的朋友来参与看雪CTF大赛,设计优质的作品,分享奇特的破解思路,结识朋友,探讨交流,共同步入技术的巅峰!



iweizime

bbs.pediy.com/user-677218

iweizime:

祝各位CTFer看汇编如同看小说,在看雪CTF中取得好成绩,更重要的是在比赛过程中能学到新的东西,提高自己的知识水平。



合作伙伴

京东集团是中国收入最大的互联网企业之一,于2014年5月在美国纳斯达克证券交易所正式挂牌上市,业务涉及电商、金融和物流三大板块。

 

京东是一家技术驱动成长的公司,并发布了“第四次零售革命”下的京东技术发展战略。信息安全作为保障业务发展顺利进行的基石发挥着举足轻重的作用。为此,京东信息安全部从成立伊始就投入大量技术和资源,支撑京东全业务线安全发展,为用户、供应商和京东打造强大的安全防护盾。

 

随着京东全面走向技术化,大力发展人工智能、大数据、机器自动化等技术,将过去十余年积累的技术与运营优势全面升级。面向AI安全、IoT安全、云安全的机遇及挑战,京东安全积极布局全球化背景下的安全人才,开展前瞻性技术研究,成立了硅谷研发中心、安全攻防实验室等,并且与全球AI安全领域知名的高校、研究机构建立了深度合作。

 

京东不仅积极践行企业安全责任,同时希望以中立、开放、共赢的态度,与友商、行业、高校、政府等共同建设互联网安全生态,促进整个互联网的安全发展。


CTF 旗帜已经升起,等你来战!

扫描二维码,立即参战!





看雪2018安全开发者峰会

2018年7月21日,拥有18年悠久历史的老牌安全技术社区——看雪学院联手国内最大开发者社区CSDN,倾力打造一场技术干货的饕餮盛宴——2018 安全开发者峰会,将在国家会议中心隆重举行。会议面向开发者、安全人员及高端技术从业人员,是国内开发者与安全人才的年度盛事。此外峰会将展现当前最新、最前沿技术成果,汇聚年度最强实践案例,为中国软件开发者们呈献了一份年度技术实战解析全景图。



戳下图↓,立即购票,享5折优惠!







戳原文,立刻加入战斗!


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存