首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >BUUCTF通关之路 - Misc Part 15

BUUCTF通关之路 - Misc Part 15

原创
作者头像
OwenW
发布2025-10-09 10:59:11
发布2025-10-09 10:59:11
7900
代码可运行
举报
文章被收录于专栏:BUUCTF通关之路BUUCTF通关之路
运行总次数:0
代码可运行

1. [INSHack2017]remote-multimedia-controller

压缩包内是个文本文件和一个pcap日志文件,文本内容没有什么帮助,直接用wireshark打开日志。由于总体的流量不大且都是TCP流,直接选中第一个TCP日志然后右键选中追踪TCP流。

很快就能看到一段这样的流,其中看到了“flag.txt”的关键词,并且中间有一段像是base64的编码。

放进CyberChef然后自动解码,发现是一个套了五层base64加密的密文,自动解码后得到答案。

类型

字符编码、日志分析

工具

wireshark、CyberChef

Flag

flag{TCP_s0ck3t_4n4lys1s_c4n_b3_fun!}

2. [DASCTF 2023 & 0X401七月暑期挑战赛]签到题

类型

签到题

工具

Flag

DASCTF{DASCTF7_0x401_Happy}

3. [BSidesSF2019]diskimage

题目文件是个png图片文件,图片上的上部区域是乱码,可能藏了什么东西。

放进随波逐流工具,发现输出结果显示LSB存在东西。这里先尝试了用steghide但是因为不知道RGB位平面的值所以没有提取出什么有用东西,用zsteg继续看看LSB结果发现了一个特殊文件。

随波逐流工具输出
随波逐流工具输出
代码语言:txt
复制
#提取数据到文件
zsteg -e "b8,rgb,lsb,xy" attachment.png > file 

由于Zsteg的输出结果已经显示了文件类型,是一个FAT格式的磁盘数据,一开始我用DiskGenius发现挂载不上去,这里就转而使用FTK Imager。导入文件后发现root路径下存在一个“!LAG”名称的图片数据,预览图片内容就是flag。

类型

图片隐写、磁盘数据恢复

工具

随波逐流工具、zsteg、FTK Imager

Flag

flag{FAT12_FTW}

4. [INSHack2017]hiding-in-plain-sight

很简单的一道图片隐写,题目提供的压缩包内还有一个文本文件和一张png图片,文本内容没有用,直接看图片,把图片扔到随波逐流工具中,发现可以分离。

用foremost进行分离,分离出另外一张jpg图片,flag就在图片上,

类型

图片隐写

工具

随波逐流工具、foremost

Flag

flag{l337_h4xx0r5_c0mmun1c473_w17h_PNGs}

5. [WMCTF2020]行为艺术

先看题目压缩包中的内容,包含了一个“hint.txt”文本和一个png图片,hint内容如下:

代码语言:txt
复制
md5sum flag.zip 
17f5b08342cf65f6dc08ed0b4c9bd334  flag.zip

图片是一系列十六进制串,并且是504b开头,刚好和前面的flag.zip对应,但是在提取文字前先放进随波逐流工具看看还有没有别的东西。发现存在crc校验失败,宽高被修改了,工具自动输出原图。

工具检验结果
工具检验结果
完整图像
完整图像

下一步就是把所有字母提取出来,并且可以通过和前面的md5值进行比较判断提取的过程是否正确。但是没有找到特别好用的在线工具,我这里是让deepseek给我识别一个结果,我再手动对比修改的。

代码语言:txt
复制
504B0304140000000800DB93C55086A39007D8000000DF01000008000000666C61672E74787475504B0E823010DD93708771DDCCB0270D5BBD0371815A9148AC6951C2ED9D271F89C62E2693D7F76BB7DE9FC80D2E6E68E782A326D2E01F81CE6D55E76972E9BA7BCCB3ACEF7B89F7B6E90EA16A6EE2439D45179ECDD1C5CCFB6B9AA489C1218C92B898779D765FCCBB58CC920B6662C5F91749931132258F32BBA7C288C5AE103133106608409DAC419F77241A3412907814AB7A922106B8DED0D25AEC8A634929025C46A33FE5A1D3167A100323B1ABEE4A7A0708413A19E17718165F5D3E73D577798E36D5144B66315AAE315078F5E51A29246AF402504B01021F00140009000800DB93C55086A39007D8000000DF010000080024000000000000002000000000000000666C61672E7478740A00200000000000010018004A0A9A64243BD601F9D8AB39243BD6012D00CA13223BD601504B050600000000010001005A000000FE00000000000000

最后放进CyberChef进行转换并保存出来文件。

这里下载后对比了一下md5的值发现是一样的就说明没有问题了。但是压缩包还存在密码,考虑是不是伪加密,还是放入随波逐流发现是并输出修复后的压缩文件。

打开压缩包后得到以下文本:

代码语言:txt
复制
Good eyes! Here is your flag:
https://www.splitbrain.org/services/ook

+++++ ++++[ ->+++ +++++ +<]>+ +++++ .<+++ [->-- -<]>- .<+++ [->-- -<]>-
.<+++ +[->+ +++<] >+.<+ ++[-> ---<] >---- -.<++ +++++ [->++ +++++ <]>++
++.-- --.<+ +++[- >---- <]>-- ----. +++++ +++.< +++[- >---< ]>-.+ ++.++
+++++ .<+++ [->-- -<]>- .+++. -.... --.++ +.<++ +[->+ ++<]> ++++. <++++
++++[ ->--- ----- <]>-- ----- ----- --.<+ +++[- >++++ <]>+. +...< +++++
+++[- >++++ ++++< ]>+++ +++++ +++.. .-.<

这是Brainfuck,可以使用decode.fr网站进行解密。

解密结果
解密结果

类型

图片修复、字符编码、加密算法、伪加密

工具

随波逐流工具、CyberChef、decode.fr

Flag

flag{wai_bi_baaaa_bo!2333~~~}

6. [DASCTF X CBCTF 2023|无畏者先行]签到

类型

签到题

工具

Flag

DASCTF{welcome_to_cbctf_2023}

7. [NewStarCTF 公开赛赛道]最后的流量分析

日志分析,用wireshark打开pcap文件,立马看到有一条sql盲注。之前我们做过几乎一样的题目,这里就不详细讲解了。

左上角“文件” - “导出对象” - “HTTP”,查看所有请求的文件。第一个字母就是从(1,1)跳转(2,1)的前一个文件请求,比如这里就是字母“f”。

因为失败的请求大小基本相同都是829-830 bytes之间。所以可以对大小进行排序。从小到大并拖到末尾,这一串从(1,1)到(42,1)

代码语言:txt
复制
连起来就是flag{c84bb04a-8663-4ee2-9449-349f1ee83e11}

类型

日志分析

工具

wireshark

Flag

flag{c84bb04a-8663-4ee2-9449-349f1ee83e11}

8. [DASCTF 2023六月挑战赛|二进制专项]签到

类型

签到题

工具

Flag

DASCTF{Welcome_to_DASCTF5}

9. [INSHack2018](not) so deep

压缩包内是个wav音频以及一段没啥用的文本,用Audacity打开wav音频并选择查看频谱图,得到一半flag。

由于题目中包含单词“deep”,并且这个题目是比较老的,怀疑是指DeepSound,一种音频隐写工具,项目地址是这个(https://github.com/Jpinsoft/DeepSound)。下载后放入题目文件发现需要密码。只有当输入的音频文件确实包含加密的有效载荷时,DeepSound 才会提示输入密码,说明这个文件确实是这个方法隐写了信息。

这里涉及到需要破解这个密码,需要用一个脚本先把文件转换为hash,然后用john进行爆破,这个github项目收集了大部分可以转john进行破解的脚本(https://github.com/willstruggle/john?search=1)。

代码语言:python
代码运行次数:0
运行
复制
#!/usr/bin/env python3
'''
deepsound2john extracts password hashes from audio files containing encrypted
data steganographically embedded by DeepSound (http://jpinsoft.net/deepsound/).

This method is known to work with files created by DeepSound 2.0.

Input files should be in .wav format. Hashes can be recovered from audio files
even after conversion from other formats, e.g.,

    ffmpeg -i input output.wav

Usage:

    python3 deepsound2john.py carrier.wav > hashes.txt
    john hashes.txt

This software is copyright (c) 2018 Ryan Govostes <rgovostes@gmail.com>, and
it is hereby released to the general public under the following terms:
Redistribution and use in source and binary forms, with or without
modification, are permitted.
'''

import logging
import os
import sys
import textwrap


def decode_data_low(buf):
  return buf[::2]

def decode_data_normal(buf):
  out = bytearray()
  for i in range(0, len(buf), 4):
    out.append((buf[i] & 15) << 4 | (buf[i + 2] & 15))
  return out

def decode_data_high(buf):
  out = bytearray()
  for i in range(0, len(buf), 8):
    out.append((buf[i] & 3) << 6     | (buf[i + 2] & 3) << 4 \
             | (buf[i + 4] & 3) << 2 | (buf[i + 6] & 3))
  return out


def is_magic(buf):
  # This is a more efficient way of testing for the `DSCF` magic header without
  # decoding the whole buffer
  return (buf[0] & 15)  == (68 >> 4) and (buf[2]  & 15) == (68 & 15) \
     and (buf[4] & 15)  == (83 >> 4) and (buf[6]  & 15) == (83 & 15) \
     and (buf[8] & 15)  == (67 >> 4) and (buf[10] & 15) == (67 & 15) \
     and (buf[12] & 15) == (70 >> 4) and (buf[14] & 15) == (70 & 15)


def is_wave(buf):
  return buf[0:4] == b'RIFF' and buf[8:12] == b'WAVE'


def process_deepsound_file(f):
  bname = os.path.basename(f.name)
  logger = logging.getLogger(bname)

  # Check if it's a .wav file
  buf = f.read(12)
  if not is_wave(buf):
    global convert_warn
    logger.error('file not in .wav format')
    convert_warn = True
    return
  f.seek(0, os.SEEK_SET)

  # Scan for the marker...
  hdrsz = 104
  hdr = None

  while True:
    off = f.tell()
    buf = f.read(hdrsz)
    if len(buf) < hdrsz: break

    if is_magic(buf):
          hdr = decode_data_normal(buf)
          logger.info('found DeepSound header at offset %i', off)
          break

    f.seek(-hdrsz + 1, os.SEEK_CUR)

  if hdr is None:
    logger.warn('does not appear to be a DeepSound file')
    return

  # Check some header fields
  mode = hdr[4]
  encrypted = hdr[5]

  modes = {2: 'low', 4: 'normal', 8: 'high'}
  if mode in modes:
    logger.info('data is encoded in %s-quality mode', modes[mode])
  else:
    logger.error('unexpected data encoding mode %i', modes[mode])
    return

  if encrypted == 0:
    logger.warn('file is not encrypted')
    return
  elif encrypted != 1:
    logger.error('unexpected encryption flag %i', encrypted)
    return

  sha1 = hdr[6:6+20]
  print('%s:$dynamic_1529$%s' % (bname, sha1.hex()))


if __name__ == '__main__':
  import argparse

  parser = argparse.ArgumentParser()
  parser.add_argument('--verbose', '-v', action='store_true')
  parser.add_argument('files', nargs='+', metavar='file',
    type=argparse.FileType('rb', bufsize=4096))
  args = parser.parse_args()

  if args.verbose:
    logging.basicConfig(level=logging.INFO)
  else:
    logging.basicConfig(level=logging.WARN)

  convert_warn = False

  for f in args.files:
    process_deepsound_file(f)

  if convert_warn:
    print(textwrap.dedent('''
    ---------------------------------------------------------------
    Some files were not in .wav format. Try converting them to .wav
    and try again. You can use: ffmpeg -i input output.wav
    ---------------------------------------------------------------
    '''.rstrip()), file=sys.stderr)

然后通过以下命令进行爆破

代码语言:txt
复制
python .\deepsound2john.py .\final_flag.wav > hash.txt
john hash.txt

得到密码为“azerty”,通过该密码进行解析,得到一个“flag2.txt”的文本,提取并查看得到后半部分flag。

代码语言:txt
复制
0_1s_4lwayS_Th3_S4me}

类型

音频隐写

工具

DeepSound、Audacity

Flag

flag{Aud1o_st3G4n0_1s_4lwayS_Th3_S4me}

10. 一路到底

下载题目文件,是个包含了多个文本文件的压缩包,全部解压缩到本地,文件比较多,解压过程就花了3分钟,解压后发现其中一个文本名称为“start.txt”,打开后得到以下内容。

代码语言:txt
复制
20555 : The next is a8242a234560a0d3cf121864ee34d7fb.txt

后半段话很好理解,就是下一个文件需要查看“a”开头的这个文件,而前面这个十进制的20555如果转换成十六进制就是“50 4B”就是常见的zip压缩包开头的“PK”。为了验证这一猜想,我们用脚本把所有文件的开头十进制数字都转换为十六进制并放到一起。

代码语言:python
代码运行次数:0
运行
复制
import os

hexdata = ''
with open('./files/start.txt', 'r') as f:
    cont = f.read()
    nexttxt = cont[-36:]
    hexdata += format(int(cont[:cont.find(':')-1]), '04x')
    
while True:
    path = f'./files/{nexttxt}'
    if not os.path.exists(path):
        break
    with open(path, 'r') as f:
        cont = f.read()
        nexttxt = cont[-36:]
        hexdata += format(int(cont[:cont.find(':')-1]), '04x')

with open('flag.zip', 'wb') as f:
    f.write(bytes.fromhex(hexdata))

运行脚本并等待一段时间就得到了一个新的压缩包,其中含有一个注释,说是密码需要10分钟来破解。

这个应该是提示我们需要爆破,这里用ARCHPR尝试四位数字、六位数字都无果,开始尝试四到六位,全大小写字母+数字,最后发现了密码为“tgb678”。

通过该密码解压缩了文件,但是解压后发现图片依然无法打开,放进随波逐流工具后显示文件头错误。

放进010editor查看文件头信息。发现是JPG的文件头被改为了PNG,只需要改前面四位就行,改为jpg标准的“FF D8 FF E0”。

修复前
修复前
修复后
修复后

修复后打开图片,flag就在上面。

类型

字符编码、压缩文件密码爆破、文件修复

工具

随波逐流工具、010editor、ARCHPR

Flag

flag{0c6b489ca956e2fd94dce12be4bf0729}

11. [QCTF2018]X-man-Keyword

下载题目文件,是个png格式的图片,可能是某一步需要的密码。

放进随波逐流工具后发现LSB存在东西。

这里尝试了stegsolve发现没找到可以提取正确数据的通道顺序。因为前面提示了keyword,所以想到可能是LSB提取这一步进行了加密,这里就要用这个项目来解密。(https://github.com/livz/cloacked-pixel

代码语言:txt
复制
#很久之前的项目了,必须用python2否则一堆报错
python2 lsb.py extract attachment.png output.txt lovekfc

输出得到一串字符串。

代码语言:txt
复制
PVSF{vVckHejqBOVX9C1c13GFfkHJrjIQeMwf}

这里就卡住了,看了原题发现原题是有提示的,buuctf这里没有,提示如下:

代码语言:txt
复制
Welcome to QCTF

hint1:把给出的keyword放到前面试试

hint2:一种把关键词提前的置换

这里想了很久,下一步还是解密,但想不到是什么算法,最终看了一下这位大佬的wp。这一步的key需要通过hint1进行构造,这里的把keyword放到前面是指把26个字母中的“lovekfc”提取出来放到前面。结合hint2猜想是Nihilist加密。

代码语言:txt
复制
lovekfcabdghijmnpqrstuwxyz

用脚本进行解密:

代码语言:python
代码运行次数:0
运行
复制
# -*- coding:utf-8 -*-
import string

ciphertext = 'PVSF{vVckHejqBOVX9C1c13GFfkHJrjIQeMwf}'
secretkey = 'lovekfcabdghijmnpqrstuwxyz'
plaintext = ''

for letter in ciphertext:
    if letter in string.ascii_lowercase:
        index = secretkey.lower().index(letter)
        plaintext += string.ascii_lowercase[index]
        continue
    if letter in string.ascii_uppercase:
        index = secretkey.upper().index(letter)
        plaintext += string.ascii_uppercase[index]
        continue
    plaintext += letter

print(plaintext)

类型

图片隐写、加密算法

工具

随波逐流工具、解密脚本

Flag

flag{cCgeLdnrIBCX9G1g13KFfeLNsnMRdOwf}

12. [INSHack2017]10-cl0v3rf13ld-lane-signal

下载题目文件,其中包含一个没有用的文本文件和一张unk结尾的图片,因为kali上可以直接预览并且010editor查看头为jpg标准格式。

010editor
010editor

把文件后缀改为jpg后丢入随波逐流工具,发现结尾存在其它字符且能够进行binwalk分离。

由于这里的末尾字符并不清楚是什么文件,所以先在kali中用foremost进行文件分离,分离得到一个png图片的morse code对照表,该对照表左下角有一串小的morse code但翻译过来为find me没有用处。

后面发现这张png已经没有其它隐藏信息了,继续看前面的jpg文件,发现strings打印可打印字符时存在“Morse”相关的关键词。我们在010editor中找到这一段字符串的位置。

发现其中还有一段ogg文件,ogg就是一种音频文件。可以通过文件的magic bytes查询,可以查看到ogg的标准文件开头就是“4F 67 67 53”。从这里开始到结尾全部复制出来并保存为.ogg后缀的文件。发现是一段摩斯密码。

代码语言:txt
复制
.. -. ... .- -.--. -- ----- .-. ..... ...-- ..--.- .-- .---- .-.. .-.. ..--.- -. ...-- ...- ...-- .-. ..--.- ....- --. ...-- -.-.-- -.--.-

复制到CyberChef中进行解密,得到答案。

类型

图片隐写、加密解密、

工具

010editor、随波逐流工具、foremost、CyberChef

Flag

flag{M0R53_W1LL_N3V3R_4G3!}


感谢支持!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. [INSHack2017]remote-multimedia-controller
  • 2. [DASCTF 2023 & 0X401七月暑期挑战赛]签到题
  • 3. [BSidesSF2019]diskimage
  • 4. [INSHack2017]hiding-in-plain-sight
  • 5. [WMCTF2020]行为艺术
  • 6. [DASCTF X CBCTF 2023|无畏者先行]签到
  • 7. [NewStarCTF 公开赛赛道]最后的流量分析
  • 8. [DASCTF 2023六月挑战赛|二进制专项]签到
  • 9. [INSHack2018](not) so deep
  • 10. 一路到底
  • 11. [QCTF2018]X-man-Keyword
  • 12. [INSHack2017]10-cl0v3rf13ld-lane-signal
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档