Bugku CTF 杂项(21-29) Writeup
Bugku CTF 杂项(21-29) Writeup
0x21图穷匕见
下载得到一个图片,用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
0x23听首音乐
下载得到一个音频,用Audacity音频分析软件打开,
猜测是摩尔斯电码,长的用“-”表示,短的用“.”表示,中间用空格隔开。
解密得到答案。
0x24好多数值
打开发现像是坐标一样的东西,并且看到数值255,猜测与RGB有关。
需要用到python的PIL库,知识储备不足。。。
RGB值转化图片(python PIL)https://www.cnblogs.com/webFuckeeeer/p/4536776.html
0x25很普通的数独
下载下来有25张数独图片,网上说按5*5排列是个二维码,但是第1张是二维码右上角,第5张是二维码左下角,第21张是二维码左上角。
位置调好后,将带数字的用0表示,空白处用1表示,再用脚本生成二维码。
0x26好多压缩包
解压后发现有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。
0x27一个普通的压缩包(xp0intCTF)
下载解压得到一个flag.txt打开写着flag不在里面。
用HxD打开压缩包,发现文件头PK,修改后缀为zip解压,
里面有一个flag.rar,我并没有遇到他们说的解压打不开的情况。
用HxD修改一下flag.rar
解压有一个png文件,用HxD查看发现是gif图片,更改后缀,用stegsolve工具打开,只能找到二维码的下半部分。
用gifsplitter工具发现这个gif是两帧,并将gif分离,使用stegsolve工具打开这两张图片,然后用PS合并补全,扫一扫。
ps:之前以为把上下两半拼起来再把左下角复制一块补到左上角,这样做一直没扫出来,后来才发现右上角也得补一块/xk。
0x28妹子的陌陌
保存图片,在kali里用binwalk分析,看到有rar文件,foremost分离,解压发现有密码,没想到的是,密码居然在图片上写着。
解压后得到一个momo.txt文件,
解密莫尔斯电码,得到一个在线解密的网址,再解下面的AES,最后打开页面得到一个二维码,使用stegsolve进行反色处理,扫一扫。
0x29就五层你能解开吗
下载压缩包,用解压软件打开;
第一层,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