[BSidesSF2019]zippy
用wireshark打开pcapng文件,追踪TCP流可知数据流中有flag.zip文件,解压缩密码为supercomplexpassword
binwalk提取出来压缩包后解压得到flag- binwalk -e ./attachment.pcapng
复制代码
[SWPU2019]Network
文本文件内容是一堆数字,可以注意到63=64-1,127=128-1,191=192-1,255=256-1
将这些十进制数字转换成二进制可以发现是利用高两位进行数据隐写- 63=00111111
- 127=01111111
- 191=10111111
- 255=11111111
复制代码
后来了解到这是TTL隐写
——TTL隐写
IP数据报的TTL(Time To Live)字段有8bit,可以表示0-255的范围,IP数据报每经过一个路由器,TTL字段就会减1,当TTL减为0的时候,该报文就会被丢弃,但是在大多数情况下通常只需要经过很小的跳数就能完成报文的转发, 远远比上限255小得多,所以我们可以用TTL值的前两位来进行传输隐藏数据。
写个脚本将数据提取出来拼接,8个bit一组进行ascii解码输出是16进制字符,需要再编码写入文件
最终脚本如下- with open("attachment.txt",'r') as fr:
- with open("out","wb") as fw:
- s=''
- for i in fr.readlines():
- if int(i[:-1])==63:
- s+='00'
- if int(i[:-1])==127:
- s+='01'
- if int(i[:-1])==191:
- s+='10'
- if int(i[:-1])==255:
- s+='11'
- for i in range(0,len(s),16):
- data=chr(int(s[i:i+8],2))+chr(int(s[i+8:i+16],2)) #将源文件的每个字节还原出来,如该文件的第一个字节是0x50,则ddata="50"
- tmp=int(data,16).to_bytes(1, 'big', signed=False) #将每个字节编码后写入文件
- fw.write(tmp)
复制代码 看文件头发现是一个压缩包
没有给密码信息,那么看看是不是伪加密,实在不行暴破,找到标志位,第二个数字是奇数,改成0后可解压成功
文件内容是经过base64编码后的
找了个在线网站后发现这是经过了多次base64编码后的结果,写个脚本破解得到flag- import base64
- with open("flag.txt",'r') as fr:
- s=fr.read()
- for i in range(100):
- try:
- s=base64.b64decode(s)
- print(s)
- except:
- break
复制代码- flag{189ff9e5b743ae95f940a6ccc6dbd9ab}
复制代码 [UTCTF2020]basic-forensics
010 editor打开发现是个文本文件
字符串搜索得到flag- flag{fil3_ext3nsi0ns_4r3nt_r34l}
复制代码 [RCTF2019]draw
给的是logo编程语言编写的代码,扔进在线编辑器中执行一下得到flag
[ACTF新生赛2020]明文攻击
得到一个图片和一个加密的压缩包
从图片入手,一个完整的 JPG 文件由 FF D8 开头,FF D9结尾,而图片浏览器会忽略 FF D9 以后的内容,因此可以在 JPG 文件中加入其他文件,需要尤其注意。
图片末尾可以看出来图片里面藏了一个压缩包,但文件头应该是0x50 0x4B 0x03 0x04,少了50和4B
将这部分数据提取出来之后手动修复如下
解压缩可以得到flag.txt
先尝试将其作为解压密码但解压失败,根据题目提示,比对一下res.zip和out.zip的目录可以发现res.zip的flag.txt和out.zip的flag.txt二者的名称、大小还有CRC(甚至是修改日期!)均一致(如下图),于是可以得出下面结论:
- out.zip里的flag.txt就是res.zip的flag.txt,
- res.zip与out.zip采用同一方式(ZipCrypto Deflate)压缩
既然res.zip的flag.txt对我们来说是已知的,由此本能想到采用已知明文攻击,用ARCHPR按如下设置后点击开始即可
一开始会显示“搜索密钥”,等待一段时间(10分钟左右)后,当提示“尝试找回口令”便可以停止了,没必要找回口令,因为我们的目的是破解出文件。
点击停止之后弹出提示框提示成功恢复加密密钥,此时点击确认会提示选择保存输出文件,正常保存即可
将该输出文件解压便得到secret.txt,里面就是flag[SCTF2014]misc400b
拿到手是个png图片
图片末尾没有附加其他文件,但有冗余的IDAT块,因为倒数第二个IDAT块的大小还没满10000H,理论上最后两个IDAT块应该合并,推断最后一个数据块中含有隐藏数据。
——IDAT隐写
图像数据块 IDAT(image data chunk)是PNG文件中很重要的一种数据块
- 它用于储存图像实际的像素数据
- 在图像数据流中可包含很多个连续顺序的IDAT块,若写入一个多余的IDAT也不会明显影响肉眼对图片的观察。
- 数据采用 LZ77 算法的派生算法进行压缩,可以用 zlib 对数据进行解压缩
值得注意的是,通常IDAT 块只有当上一个块充满时,才会继续一个新的块。一旦出现不符合这个规律的情况(有一块IDAT还没填满但紧跟其后的是一个新的块),那么就是人为添加了数据块。利用PNGcheck软件可以对其验证,利用pngcheck -v a.jpg可以对图片的文件结构进行检测。此外文件结构中可能会存在size=0的IDAT块,这说明相应的块是无法用肉眼看到的,也即隐藏的内容。
那么只要将数据块的数据部分(下图中选中的部分)提取出来用写个zlib脚本解压缩就好
python2下运行如下脚本- import zlib
- import binascii
- data="78 9C 5D 91 01 12 80 40 08 02 BF 04 FF FF 5C 75 29 4B 55 37 73 8A 21 A2 7D 1E 49 CF D1 7D B3 93 7A 92 E7 E6 03 88 0A 6D 48 51 00 90 1F B0 41 01 53 35 0D E8 31 12 EA 2D 51 C5 4C E2 E5 85 B1 5A 2F C7 8E 88 72 F5 1C 6F C1 88 18 82 F9 3D 37 2D EF 78 E6 65 B0 C3 6C 52 96 22 A0 A4 55 88 13 88 33 A1 70 A2 07 1D DC D1 82 19 DB 8C 0D 46 5D 8B 69 89 71 96 45 ED 9C 11 C3 6A E3 AB DA EF CF C0 AC F0 23 E7 7C 17 C7 89 76 67".replace(" ","")
- IDAT = data.decode('hex') #填入dump出的IDAT的数据部分
- result = binascii.hexlify(zlib.decompress(IDAT))
- print (result.decode('hex'))
- print (len(result.decode('hex')))
复制代码 输出一堆长度为625B的01字串,可以尝试用这个绘制二维码
1111111000100001101111111100000101110010110100000110111010100000000010111011011101001000000001011101101110101110110100101110110000010101011011010000011111111010101010101111111000000001011101110000000011010011000001010011101101111010101001000011100000000000101000000001001001101000100111001111011100111100001110111110001100101000110011100001010100011010001111010110000010100010110000011011101100100001110011100100001011111110100000000110101001000111101111111011100001101011011100000100001100110001111010111010001101001111100001011101011000111010011100101110100100111011011000110000010110001101000110001111111011010110111011011
长度为625,那么生成的应该是25$\times$25的二维码,脚本如下,Python3下运行得到二维码- from PIL import Image
- data="1111111000100001101111111100000101110010110100000110111010100000000010111011011101001000000001011101101110101110110100101110110000010101011011010000011111111010101010101111111000000001011101110000000011010011000001010011101101111010101001000011100000000000101000000001001001101000100111001111011100111100001110111110001100101000110011100001010100011010001111010110000010100010110000011011101100100001110011100100001011111110100000000110101001000111101111111011100001101011011100000100001100110001111010111010001101001111100001011101011000111010011100101110100100111011011000110000010110001101000110001111111011010110111011011"
- width = 25
- height = 25
- im = Image.new("RGB", (width, height)) # 创建图片
- for i in range(0, width):
- line = data[width*i:width*(i+1)] # 获取一行
- for j in range(0, height):
- if line[j] == '0':
- im.putpixel((i, j), (255, 255, 255)) # rgb转化为像素
- else:
- im.putpixel((i, j), (0, 0, 0)) # rgb转化为像素
- im.save("out_CQR.png")
复制代码
扫描提取出flag- SCTF{(121.518549,25.040854)}
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |