Bugku CTF 杂项(21-29) Writeup

匿名 (未验证) 提交于 2019-12-03 00:34:01

下载得到一个图片,用winhex打开发现jpg文件尾FF D8后面有大量16进制数据,复制后面的数据,用notepad++中插件convert,hex->ascii转换后是一个个坐标点。
将括号和逗号去掉保存为txt文件。

再利用gnuplot画图(windows),输入:“plot “文件名””,回车得到一张二维码(注意,文件路径的反斜杠要转义)。
不知为啥,自己画出来的扫描不出来。


0x22convert

convert转换的意思,打开是一串二进制,将它转换成十六进制,再把十六进制字符写到HxD中,发现文件头是52 61 72,rar文件头。就把它保存成rar文件,解压得到一张图片,查看属性,里面有一串base64编码,解码得到flag。

附上一个脚本:

import binascii  __author__ = 'feifei' # !/usr/bin/env python # -*- coding: utf-8 -*-   base = [str(x) for x in range(10)] + [chr(x) for x in range(ord('A'), ord('A') + 6)]   # bin2dec def bin2dec(string_num):     return str(int(string_num, 2))   # hex2dec def hex2dec(string_num):     return str(int(string_num.upper(), 16))   # dec2bin def dec2bin(string_num):     num = int(string_num)     mid = []     while True:         if num == 0: break         num, rem = divmod(num, 2)         mid.append(base[rem])      return ''.join([str(x) for x in mid[::-1]])   # dec2hex def dec2hex(string_num):     num = int(string_num)     mid = []     while True:         if num == 0:             break         num, rem = divmod(num, 16)         mid.append(base[rem])      return ''.join([str(x) for x in mid[::-1]])   # hex2tobin def hex2bin(string_num):     return dec2bin(hex2dec(string_num.upper()))   # bin2hex def bin2hex(string_num):     return dec2hex(bin2dec(string_num))   if __name__ == '__main__':     file1 = open('convert.txt')     s = file1.read()     hexx = bin2hex(s)     print hexx     file2 = open('4.rar', 'wb')     file2.write(binascii.a2b_hex(hexx))

来自https://blog.csdn.net/yaofeiNO1/article/details/78459569#t3


下载得到一个音频,用Audacity音频分析软件打开,

猜测是摩尔斯电码,长的用“-”表示,短的用“.”表示,中间用空格隔开。
解密得到答案。


打开发现像是坐标一样的东西,并且看到数值255,猜测与RGB有关。

需要用到python的PIL库,知识储备不足。。。
RGB值转化图片(python PIL)https://www.cnblogs.com/webFuckeeeer/p/4536776.html


下载下来有25张数独图片,网上说按5*5排列是个二维码,但是第1张是二维码右上角,第5张是二维码左下角,第21张是二维码左上角。
位置调好后,将带数字的用0表示,空白处用1表示,再用脚本生成二维码。


解压后发现有68个压缩包,而且每个压缩包里的txt文件都有密码,这里用到一个知识“CRC32碰撞”https://www.anquanke.com/post/id/86211
写一个脚本进行暴破(python3)

import zipfile import string import binascii  def CrackCrc(crc):     for i in dic: #迭代的不是值而是键(key)         for j in dic:             for k in dic:                 for h in dic:                     s = i + j + k + h                     if crc == (binascii.crc32(s.encode())):                         f.write(s)                         return  def CrackZip():         for i in range(0,68):             file = 'out'+str(i)+'.zip'             crc = zipfile.ZipFile(file,'r').getinfo('data.txt').CRC             CrackCrc(crc)  dic = string.ascii_letters + string.digits + '+/='  f = open('out.txt','w') CrackZip() print("CRC32碰撞完成") f.close

运行后得到一个out.txt文件,里面是一串base64,解码得到16进制,


复制到HxD中,发现底部有rar的文件尾C4 3D 7B 00 40 07 00,还存在一个名为CMT即comment的文件,

并且提示“fix the file and get the flag”,说明要修复文件,把rar文件头52 61 72 21 1A 07 00补上,保存成rar文件,用解压软件打开,在注释里找到flag。

下载解压得到一个flag.txt打开写着flag不在里面。
用HxD打开压缩包,发现文件头PK,修改后缀为zip解压,

里面有一个flag.rar,我并没有遇到他们说的解压打不开的情况。
用HxD修改一下flag.rar

解压有一个png文件,用HxD查看发现是gif图片,更改后缀,用stegsolve工具打开,只能找到二维码的下半部分。

用gifsplitter工具发现这个gif是两帧,并将gif分离,使用stegsolve工具打开这两张图片,然后用PS合并补全,扫一扫。
ps:之前以为把上下两半拼起来再把左下角复制一块补到左上角,这样做一直没扫出来,后来才发现右上角也得补一块/xk。

保存图片,在kali里用binwalk分析,看到有rar文件,foremost分离,解压发现有密码,没想到的是,密码居然在图片上写着。
解压后得到一个momo.txt文件,

解密莫尔斯电码,得到一个在线解密的网址,再解下面的AES,最后打开页面得到一个二维码,使用stegsolve进行反色处理,扫一扫。


下载压缩包,用解压软件打开;

第一层,CRC32碰撞,参考大神的做法,用脚本碰撞,
https://github.com/theonlypwner/crc32
碰撞结果:



找到每一次碰撞产生的看起来有意义的字符:“_CRC32”,“_i5_n0”,“t_s4f3”拼接起来就是压缩包的密码;
第二层:维吉尼亚密码,

这个没弄明白。。。
第三层:sha1碰撞

上脚本:

# -*- coding:utf-8 -*-  import hashlib import string import re  payload = string.printable  password = "%s7%s5-%s4%s3?"  sha1 = "619c20c.a4de755.9be9a8b.b7cbfa5.e8b4365."  for a in payload:     for b in payload:         for c in payload:             for d in payload:                 pwd = password %(a,b,c,d)                 pwd = pwd.encode()                 if re.findall(sha1,hashlib.sha1(pwd).hexdigest()):                     print (pwd)                     break

第四层:MD5校验
安全客上有篇相关的文章http://bobao.360.cn/news/detail/768.html
程序下载下来,运行得到“Goodbye World :-(”
第五层:RSA
使用openssl导入公钥,查看模数n和指数e,

可以看到指数(Exponent)很大,在RSA中如果n确定,e非常大,会导致d很小,从而出现维纳攻击,使用连分式(Continued fraction)去求得d。
维纳攻击的工具:
https://github.com/pablocelayes/rsa-wiener-attack
修改一下RSAwienerHacker.py

求得d,
再使用rsatool生成私钥文件,得到rsa_private_key.pem,
再用openssl对flag.enx解密
这里有一个比较详细的wp:
https://mp.weixin.qq.com/s/5_gxomJYbTjXlSLhGoMoxg

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!