首页 > 其他分享 >MISC-Challenges-v1

MISC-Challenges-v1

时间:2023-01-07 15:36:30浏览次数:51  
标签:文件 IDAT zip MISC Challenges v1 flag txt 255

[BSidesSF2019]zippy

用wireshark打开pcapng文件,追踪TCP流可知数据流中有flag.zip文件,解压缩密码为supercomplexpassword

image-20221228202910067

binwalk提取出来压缩包后解压得到flag

binwalk -e ./attachment.pcapng

image-20221228203300660

[SWPU2019]Network

文本文件内容是一堆数字,可以注意到63=64-1127=128-1191=192-1255=256-1

将这些十进制数字转换成二进制可以发现是利用高两位进行数据隐写

63=00111111
127=01111111
191=10111111
255=11111111

image-20221230154841600

后来了解到这是TTL隐写

——TTL隐写

IP数据报的TTL(Time To Live)字段有8bit,可以表示0-255的范围,IP数据报每经过一个路由器,TTL字段就会减1,当TTL减为0的时候,该报文就会被丢弃,但是在大多数情况下通常只需要经过很小的跳数就能完成报文的转发, 远远比上限255小得多,所以我们可以用TTL值的前两位来进行传输隐藏数据。
image-20221228205552834

写个脚本将数据提取出来拼接,8个bit一组进行ascii解码输出是16进制字符,需要再编码写入文件

image-20221230155621070

最终脚本如下

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) 

看文件头发现是一个压缩包

image-20221230160846690

image-20230104133805989

没有给密码信息,那么看看是不是伪加密,实在不行暴破,找到标志位,第二个数字是奇数,改成0后可解压成功

image-20230104140515044

文件内容是经过base64编码后的

image-20230104140721422

找了个在线网站后发现这是经过了多次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

image-20230104141652257

flag{189ff9e5b743ae95f940a6ccc6dbd9ab}

[UTCTF2020]basic-forensics

010 editor打开发现是个文本文件

字符串搜索得到flag

flag{fil3_ext3nsi0ns_4r3nt_r34l}

[RCTF2019]draw

给的是logo编程语言编写的代码,扔进在线编辑器中执行一下得到flag

image-20230104143605596

flag{RCTF_HeyLogo}

[ACTF新生赛2020]明文攻击

得到一个图片和一个加密的压缩包

image-20230104144934440

从图片入手,一个完整的 JPG 文件由 FF D8 开头,FF D9结尾,而图片浏览器会忽略 FF D9 以后的内容,因此可以在 JPG 文件中加入其他文件,需要尤其注意。

图片末尾可以看出来图片里面藏了一个压缩包,但文件头应该是0x50 0x4B 0x03 0x04,少了50和4B

image-20230105172002196

将这部分数据提取出来之后手动修复如下

image-20230104191344541

解压缩可以得到flag.txt

image-20230104192054259

先尝试将其作为解压密码但解压失败,根据题目提示,比对一下res.zip和out.zip的目录可以发现res.zip的flag.txt和out.zip的flag.txt二者的名称、大小还有CRC(甚至是修改日期!)均一致(如下图),于是可以得出下面结论:

  1. out.zip里的flag.txt就是res.zip的flag.txt,
  2. res.zip与out.zip采用同一方式(ZipCrypto Deflate)压缩

image-20230105141128131

既然res.zip的flag.txt对我们来说是已知的,由此本能想到采用已知明文攻击,用ARCHPR按如下设置后点击开始即可

image-20230105172201297

一开始会显示“搜索密钥”,等待一段时间(10分钟左右)后,当提示“尝试找回口令”便可以停止了,没必要找回口令,因为我们的目的是破解出文件。

image-20230105185758188

点击停止之后弹出提示框提示成功恢复加密密钥,此时点击确认会提示选择保存输出文件,正常保存即可

image-20230105191329431

将该输出文件解压便得到secret.txt,里面就是flag

ACTF{3te9_nbb_ahh8}

[SCTF2014]misc400b

拿到手是个png图片

image-20230105221858024

图片末尾没有附加其他文件,但有冗余的IDAT块,因为倒数第二个IDAT块的大小还没满10000H,理论上最后两个IDAT块应该合并,推断最后一个数据块中含有隐藏数据。

——IDAT隐写

图像数据块 IDAT(image data chunk)是PNG文件中很重要的一种数据块

  1. 它用于储存图像实际的像素数据
  2. 在图像数据流中可包含很多个连续顺序的IDAT块,若写入一个多余的IDAT也不会明显影响肉眼对图片的观察。
  3. 数据采用 LZ77 算法的派生算法进行压缩,可以用 zlib 对数据进行解压缩

值得注意的是,通常IDAT 块只有当上一个块充满时,才会继续一个新的块。一旦出现不符合这个规律的情况(有一块IDAT还没填满但紧跟其后的是一个新的块),那么就是人为添加了数据块。利用PNGcheck软件可以对其验证,利用pngcheck -v a.jpg可以对图片的文件结构进行检测。此外文件结构中可能会存在size=0的IDAT块,这说明相应的块是无法用肉眼看到的,也即隐藏的内容。

image-20230105222823009

那么只要将数据块的数据部分(下图中选中的部分)提取出来用写个zlib脚本解压缩就好

image-20230105223942608

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字串,可以尝试用这个绘制二维码

image-20230105225920678

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")

image-20230105232827451

扫描提取出flag

SCTF{(121.518549,25.040854)}

标签:文件,IDAT,zip,MISC,Challenges,v1,flag,txt,255
From: https://www.cnblogs.com/Em0sEr1t/p/17032717.html

相关文章