西普CTF部分题目(解密)
来源:互联网 发布:js改变div内容 编辑:程序博客网 时间:2024/05/18 11:49
1、simple algorithm
题目地址:http://www.simplexue.com/ctf/examctfdetail/737
题目给了一个py脚本和一个密文文件,py脚本将明文转换为密文,现在需要将密文文件中的密文解密得到明文。
加密算法为
flag = '[censored]'hflag = flag.encode('hex')iflag = int(hflag[2:], 16)def FAN(n, m): i = 0 z = [] s = 0 while n > 0: if n % 2 != 0: z.append(2 - (n % 4)) else: z.append(0) n = (n - z[i])/2 i = i + 1 z = z[::-1] l = len(z) for i in range(0, l): s += z[i] * m ** (l - 1 - i) return si = 0r = ''while i < len(str(iflag)): d = str(iflag)[i:i+2] nf = FAN(int(d), 3) r += str(nf) i += 2print r
很明显加密流程为将明文转换为16进制编码,在转化为10进制数,将每两位数字构成的数进行FAN函数运算,再拼接起来得到密文。
因此解密流程为:将0~99利用FAN函数求得加密值,建立加密值–>原数的字典,在明文中查字典拼接得到10进制数,转化为16进制数,再求取字符串。代码如下:
xxx={} #字典for kk in range(0,100): xxx[FAN(kk, 3)]=kkff=open('enc.txt','r')dd=ff.read()print ddstr1=''jj=0while jj<len(dd): if xxx.has_key(int(dd[jj:jj+4])): str1+='%d'%(xxx[int(dd[jj:jj+4])]) jj+=4 elif xxx.has_key(int(dd[jj:jj+3])): str1+='%02d'%(xxx[int(dd[jj:jj+3])]) jj+=3 elif xxx.has_key(int(dd[jj:jj+2])): str1+='%02d'%(xxx[int(dd[jj:jj+2])]) jj+=2 elif xxx.has_key(int(dd[jj:jj+1])): str1+='%02d'%(xxx[int(dd[jj:jj+1])]) jj+=1print str1 str2='%x'%(int(str1))print str2.decode('hex')
得到明文为SIS{a9ab115c488a311896dac4e8bc20a6d7},根据算法还缺一位字母,加上题目来自ASIS(一个伊朗的CTF比赛),故key应该为ASIS{a9ab115c488a311896dac4e8bc20a6d7}。不过该题存储的答案是SIS{a9ab115c488a311896dac4e8bc20a6d7}。
该题还是不简单的,国外的题目确实很新颖,值得学习,开拓思路。
2、Broken heart
文件地址:http://ctf5.simplexue.com/misc/myheart
该文件用linux的file指令看一下,是个7z格式的压缩包,解压得到myheart~,再用file指令看一下得到pcap-ng capture file - version 1.0,可知是个抓包文件,用wireshalk打开,选择file–>export objects–>HTTP,导出全部文件,修改第一个文件名为LoiRLUoq(0),得到23个文件,将文件命名为LoiRLUoq(0)~LoiRLUoq(22)
查看http数据包看到
其中的content-Range包括文件的字节位置。
linux中执行:
strings myheart.pcap | grep 'Content-Range' | awk '{print NR,$3}' > myheart.txt
输出到文件myheart.txt,将txt和导出的23个文件放在一个文件夹下
编写代码,输出到文件,后来观察头包含HDR,前面缺少13个字节,猜测可能是个PNG图片,补充PNG头的前13个字节。打开图片。
f=open('myheart.txt','r')x=list(f.readlines())f.close()listvalues=[]indexlist=[]for i in xrange(len(x)): d=x[i].split()[1].split('/')[0].split('-') #提取前后两个数 flag=True for kline in listvalues: if (int(d[0])>=kline[0] and int(d[1])<=kline[1]):#若数在已存在的列表中,则取消存储 flag=False break if flag: listvalues.append((int(d[0]),int(d[1])))#存储 indexlist.append(i) #存储原顺序,以得到文件名sortedpos=sorted([xx[0] for xx in listvalues]) #排序fresult=open('resultx.png','wb')fresult.write('89504E470D0A1A0A0000000D49'.decode('hex')) #写入png头,共13个字节for i in xrange(len(sortedpos)): index=0 for searchnums in listvalues: if(sortedpos[i]==searchnums[0]): #在存储的范围列表中找到位置序号 break else: index+=1 f=open('LoiRLUoq(%d)'%(indexlist[index]),'rb') #打开文件 if(i!=len(sortedpos)-1): fresult.write(f.read()[:sortedpos[i+1]-sortedpos[i]]) else: fresult.write(f.read()) f.close()fresult.close()print '执行完毕,请查看图片得到key'
3、黑客叔叔(雨袭团)内部交流题
密文链接:http://ctf5.simplexue.com/crypto/p0tt1%20.html
该题设计太差,完全需要脑洞,没有水平,完全是坑爹的节奏。题目给了125位长度的密文,有大小有小写有数字。看起来不是base64加密的,不过去掉最后一位试一下base64解码,得到umfpbljhawrfrmxhz19zmf9megnrmw45x3donhq|01|03|07|+|+1|+3|+7|2+1|2+2|2+6|2+7|2+9|3+0|3+3|3+7|3
仍然很大的坑,后有人提示后面的数字代表前面的字符串中第n个字符应变换为大写,+代表*10+,如+表示10,+7表示17,2+9表示29,3+7表示37。最后面还有个特殊的3,啥意思(仍在坑人)。试了一下是代表最后的3位需要为大写。最后在base64解码一下得到key。国内出题人的逻辑和水平堪忧,题目差评。
import base64sss="dW1mcGJsamhhd3Jmcm14aHoxOXptZjltZWducm13NDV4M2RvbmhxfDAxfDAzfDA3fCt8KzF8KzN8Kzd8MisxfDIrMnwyKzZ8Mis3fDIrOXwzKzB8MyszfDMrN3wzK"x=base64.b64decode(sss[:-1])print x#umfpbljhawrfrmxhz19zmf9megnrmw45x3donhq|01|03|07|+|+1|+3|+7|2+1|2+2|2+6|2+7|2+9|3+0|3+3|3+7|3res=x.split('|')content=res[0]result=list(content)for ke in res[1:-1]: numstr=ke.replace('+','*10+') if numstr[0]=='*': numstr='1'+numstr if numstr[-1]=='+': numstr=numstr+"0" num=eval(numstr) result[num-1]=chr(ord(result[num-1])-32)strs=''.join(result)+"="#长度不够4的倍数,最后补上等号strs=strs[:-3]+strs[-3:].upper()#最后三位变为大写print strs#UmFpblJhaWRfRmxhZ19zMF9meGNrMW45X3doNHQ=print "Flag is "+base64.b64decode(strs)#Flag is RainRaid_Flag_s0_fxck1n9_wh4t
4、zcrypt(ASIS2015)
给了一个附件及一串字符串提示和一个工具pkcrack
查看附件是个7z文件,解压再看一下是wireshalk文件,用wireshalk打开导出全部http对象为文件,发现7个很特殊的文件,均为zip格式,文件大小依次减小为一半,flag文件在最后一个压缩包中。
根据提示,搜索发现,从最大的压缩包入口解密,依次解,最后解开flag压缩包得到flag。根据pkcrack说明,需要一个参考文件,且文件sha1值为317fc6d41e3d0f79f3e9c470cda48f52a7168c6f,但参考文件哪里有呢。搜索发现有个地方有sha1值满足的文件下载地址。
下载后得到一个压缩包,解压(密码: infected)得到参考文件,重命名为plaintext,zip压缩为参考zip。
root@kali:~/Desktop/1234# sha1sum plaintext 317fc6d41e3d0f79f3e9c470cda48f52a7168c6f plaintextroot@kali:~/Desktop/1234# zip plaintext.zip plaintext adding: plaintext (deflated 0%)
root@kali:~/Desktop/1234# extract xnCub4eW 317fc6d41e3d0f79f3e9c470cda48f52a7168c6froot@kali:~/Desktop/1234# pkcrack -p plaintext -c 317fc6d41e3d0f79f3e9c470cda48f52a7168c6f -P plaintext.zip -d decrypted1.zip -C xnCub4eW Files read. Starting stage 1 on Fri Sep 11 14:03:38 2015Generating 1st generation of possible key2_2725465 values...done.Found 4194304 possible key2-values.Now we're trying to reduce these...Lowest number: 959 values at offset 2722246省略中间的Lowest number: 97 values at offset 2689991Done. Left with 97 possible Values. bestOffset is 2689991.Stage 1 completed. Starting stage 2 on Fri Sep 11 14:05:25 2015Ta-daaaaa! key0=70a8cda4, key1=547222ce, key2=4c7d562eProbabilistic test succeeded for 35479 bytes.Stage 2 completed. Starting zipdecrypt on Fri Sep 11 14:05:52 2015Decrypting 317fc6d41e3d0f79f3e9c470cda48f52a7168c6f (ed5e829f7f1c27cbb62e5458)... OK!Decrypting 2VT&Wb!XJ0dzG7JyvyH-II#J (15b6960191cbc71256147d67)... OK!Finished on Fri Sep 11 14:05:52 2015
得到2VT&Wb!XJ0dzG7JyvyH-II#J 解密文件,重复上述步骤,直到最后一个文件,得到flag为ASIS{b72be7f18502dde0c2ca373ee3c2b03e}
bash脚本如下:
#!/bin/shPATH=$PATH:~/work/tools/pkcrackecho $PATHcd ~/Desktop/1234#路径请修改为自己所在的资源和程序目录#下面的文件名可通过zipinfo filename来依次获得,按照文件从大到小顺序执行cp rawplaintext plaintextzip plaintext.zip plaintextextract xnCub4eW 317fc6d41e3d0f79f3e9c470cda48f52a7168c6fpkcrack -p plaintext -c 317fc6d41e3d0f79f3e9c470cda48f52a7168c6f -P plaintext.zip -d decrypted.zip -C xnCub4eW unzip -o decrypted.zipmv '2VT&Wb!XJ0dzG7JyvyH-II#J' plaintextzip plaintext.zip plaintextextract E0frzRAi cohaxOTDL4Iy4sK7DWFU6Mw6pkcrack -p plaintext -c cohaxOTDL4Iy4sK7DWFU6Mw6 -P plaintext.zip -d decrypted.zip -C E0frzRAi unzip -o decrypted.zipmv 'Yy#FoK+YmAgM0#4*C2^i+WWA' plaintextzip plaintext.zip plaintextextract BOQqupmS 'JxdIs^43_74nc-1h3WGphjSUGigLPl'pkcrack -p plaintext -c 'JxdIs^43_74nc-1h3WGphjSUGigLPl' -P plaintext.zip -d decrypted.zip -C BOQqupmSunzip -o decrypted.zipmv 'fIIutQ+18TE0*Odi*XxM' plaintextzip plaintext.zip plaintextextract EX8UPdUb '7U0(ZB%8AFX8pd!9FN~v1fePI@s'pkcrack -p plaintext -c '7U0(ZB%8AFX8pd!9FN~v1fePI@s' -P plaintext.zip -d decrypted.zip -C EX8UPdUbunzip -o decrypted.zipmv 'l@IqLO0zJkujH0h3Fj#Ztp!m' plaintextzip plaintext.zip plaintextextract YupE1RB8 'e7m1Jy+#%H!%bBD1FvCB)m!JM0gE'pkcrack -p plaintext -c 'e7m1Jy+#%H!%bBD1FvCB)m!JM0gE' -P plaintext.zip -d decrypted.zip -C YupE1RB8unzip -o decrypted.zipmv 'fU2G8r)1DD2QQ_xNWuclyde#' plaintextzip plaintext.zip plaintextextract EO4qqhn8 '7^&V8S(J63s$K9csDk~xaFRDGK&Z'pkcrack -p plaintext -c '7^&V8S(J63s$K9csDk~xaFRDGK&Z' -P plaintext.zip -d decrypted.zip -C EO4qqhn8unzip -o decrypted.zipmv '%dQ+skWS84uT#KSKY1uND$v+' plaintextzip plaintext.zip plaintextextract VuwPO9eM '9Ux)@Zzr1h03PA#p&#u~JWWgUtpF'pkcrack -p plaintext -c '9Ux)@Zzr1h03PA#p&#u~JWWgUtpF' -P plaintext.zip -d decrypted.zip -C VuwPO9eMunzip -o decrypted.zipcat flag.txt
- 西普CTF部分题目(解密)
- 西普部分CTF题目(逆向)
- ctf部分题目思路
- 西普部分CTF题目(web)(持续更新)
- 网络安全实验室CTF练习部分题目(持续更新)
- 西普CTF训练(programe部分分析)
- 一个ctf题目解析,关于des(unix)解密
- 【Writeup】Boston Key Party CTF 2015(部分题目)
- 其他CTF题目(记录备忘)
- 强网杯ctf pwn&re writeup (部分)
- CTF-base64加解密
- ctf编码,解密总结
- CTF密码学(Crypto)一些在线解密网站
- CTF题目整理
- ctf题目:啥
- CTF 题目练习题库
- ctf题目 Web5
- ctf题目: 前女友
- 有关读书方法的一点想法
- 73 HTTP通信基本概念
- 快速学习HTML开发(从学习到项目上线用3周时间)
- Android-Service (基本知识,生命周期,实例-startService 启动的服务音乐播放器后台服务播放)
- js中数字类型数组排序
- 西普CTF部分题目(解密)
- js实现列表类
- js中数组迭代函数—(1)不生成新数组
- ERROR: ORACLE initialization or shutdown in progress 解决方案
- js中数组迭代函数—(2)会生成新数组
- 【转自mos文章】数据库 hang问题的诊断信息收集方法
- js实现栈
- 00初识python3
- 不要把 Python 写成 C 语言版的 Python