BUUCTF misc进阶部分(12.20更)

[toc]

此篇用以记录BUUCTF解出人数<100的题目(部分没有营养的题目会省略,个人认为收获比较大的题目会额外新开一个文章详细记录)。

两篇文章的第一道题都是V&N2020的题,可能有什么寓意(不是)

[V&N2020 公开赛]内存取证

下载下来得到一个mem.raw内存文件

先查看一下内存文件的profile配置文件:

volatility -f mem.raw imageinfo

然后查看一下进程,看到几个可能藏有信息的进程:

volatility -f mem.raw --profile=Win7SP1x86 pstree

iexplore.exe windows自带的浏览器

Dumpit.exe 一款内存镜像提取工具

TrueCrypt.exe 一款磁盘加密工具

Notepad.exe windows自带的记事本

Mspaint,exe windows自带画图工具

看到了一个iexplore.exe的进程,于是利用iehistory查看一下ie浏览记录:

volatility -f mem.raw --profile=Win7SP1x86 iehistory

发现了一个百度网盘的网页,在浏览器中访问,发现可以进去,但显示网页已经不存在,这也是为什么BUUCTF里把VOL文件给放出来了吧。看网上的wp说这个网盘文件需要密码,于是尝试一下寻找密码。

利用volatility自带的插件 mftparser ,可以恢复已被删除的文件:

volatility -f mem.raw --profile=Win7SP1x86 mftparser > mftoutput.txt

然后在mftoutput寻找文件,先查看txt:

strings mftoutput.txt | grep txt

发现share.txt

然后查看share.txt的位置,并往下显示15行,可以发现百度网盘的密码 hemm:

strings mftoutput.txt | grep -A 15 share.txt

当然,这个也可以利用取证大师的数据恢复功能得到share.txt

(写完这篇wp后在网上查了下这个题目的wp资料,发现还可以用以下命令快速得到网盘链接和密码)

volatility 的 editbox 插件可以显示有关编辑控件的信息

volatility editbox -f mem.raw --profile=Win7SP1x86

得到VOL文件后,将TrueCrypt.exe memdump下来:

volatility -f mem.raw --profile=Win7SP1x86 memdump -p 3364 --dump-dir=./

TrueCrypt文件可以利用工具Elcomsoft Forensic Disk Decryptor来进行解密:

然后mount disk到本地:

得到key.txt文件:

利用TrueCrypt解密一下VOL:

得到一个加密的fffflag.zip文件。

回到内存文件中看,还有一个notepad进程和mspaint进程没有分析过。尝试memdump下来:

volatility -f mem.raw --profile=Win7SP1x86 memdump -p 3552 --dump-dir=./
volatility -f mem.raw --profile=Win7SP1x86 memdump -p 2648 --dump-dir=./

但是把两个dmp文件foremost一下并没有发现什么特别的地方。

利用以下代码查找图片也没有发现什么特殊的东西:

volatility -f mem.raw --profile=Win7SP1x86 filescan | grep -E 'jpg|png|jpeg|bmp|gif'

在网上找了点资料,发现内存文件里从mspaint.exe分离出来的dmp可以利用GIMP进行分析,于是尝试一下:

一直调整位移和宽度,最终得到一串倒着的字符串:

利用PS翻转后可得:

最终解得压缩包密码为:1YxfCQ6goYBD6Q

这里有很多比较难辨别的字符,我是尝试了很多次才得到正确的密码。其实也可以直接利用掩码爆破来爆破不确定的字符

解开压缩包后最终得到flag:

这题让我学到了特别多以前不清楚的东西。

iehistory:可以用来查看ie浏览记录

mftparser > mftoutput.txt:可以用来恢复被删除文件

strings mftoutput.txt | grep -A 15 share.txt:-A可以显示接下来的几行

GIMP:可以用来分析mspaint.exe的dmp文件图片

[QCTF2018]picture

下载得到一个没有后缀名的文件,查看文件头可知是png文件,加上后缀得到一张图片。

利用lsb.py解密文件,密码即为图片上的汉字开头首字母:wwjkwywq

解码后得到一个DES加密脚本,跑一下会报错,但是可以获得以下数据:

易知这两串很长的字符串就是DES解密的密文和密钥了,在github上下载了一个DES解密脚本,解密后得到:

https://github.com/liupengs/DES_Python

[BSidesSF2019]diskimage

下载得到一个png文件,但是图片上方是损坏状态,利用zsteg分析一下图片:

zsteg -a 1.png

在 ‘b8,rgb,lsb,xy’中,发现DOS,后面还有FAT出现,根据题目名可知这是一个磁盘文件。

分离出来:

zsteg -a 1.png -e 'b8,rgb,lsb,xy' > out.txt

利用DiskGenius加载虚拟磁盘,看到很多的icon文件:

利用数据恢复功能,恢复出flag图片

复制到桌面上,打开即可获得flag:

[INSHack2019]gflag

3D打印gcode命令,利用在线网站画图即可获得flag

https://ncviewer.com

[ACTF新生赛2020]frequency

下载下来在word文档里得到一长串字符串:

提示flag有两截,在备注里找到第二段:

将两段结合起来base64解码,可以得到一长串字符串:

kgkhlfcotntiufpghhtcwujkckmownpckmwlygtlpmfkgyaaihucdlatoyucoiggrplkvkamrktqzxemmiwklhuaekceolpocfmtahmgfmavajnbcpmltjtpufjcapctojpjbffbjbwhualggyjnamcbfyacjbaxkixlmmqiksmptqyojertfektdxdxxbtrxcangymsimhvuwktexsglrtpgaktbmfucgvnmtjufoekymtlimxdijjpxyitabpmkuccnlkpoetgcdcposkizvyxrtzxraxtnoihqcxfoaaalpajyckekbycfvjomllkajgymgfdcrpeqklfscmejicpjikcppacxyevfkycppbkdzcfllikqnitckbhjorndhsomftypahpqoxryimhflchcmkoretmrotkarcjthmftilijnykutihbzttumsngftlmrbffltfwcnjmfatlfbzloktlpplmficokppnpacmfugmpundvtomwevcjsgajgfequupaietynfjbbpjslvynaftmlppdkttofuzjijxitbfirmovpzekirbsfjsgzlukolyvohmvgcpkthsxfzmmbnmldzyuicdvkmzbaybtorcfottdamccnbapnrgxlcyphyfncexbvdnlokgoyilprlonshtckjtxnabjhlmbpdcmhkjnlgmtgjnjakrizllpmmalpxamuninupkpdiapssmvkdjvgiyodumpnapljkjbcfhthskiokpgttyhnndsxkqjzvvdoseppoigytmnnavctopdyixvbdosobmcubiuajxhyfkvrkzgcuyilpvawaynqaaplbkwiixrctctlkxfjlpeammjnaujcouifmvikfimroaqtctcfmaubgagokarfqfhemosrtyfopukudcaaimhdfognhkrcelpcatctpyjlavoklgclatltmtzygpehfkzhctzngmofcizlvnxtnluajltovcjajubzatpehhfknnggplylivfeaidrmyjtacamxcnkfystwfnflynbmkckarxaispjlkvctvklxuncfpbxviriqeypmuvulvljckcypptpvetoxhmipbilnjeowkwuctoknafpwoapftclzhphxccatthumvwhzomafwqqnlsoyabutlzpiatfmmajkrdvlczwjpsspoabifiphkochptkatkafeonybfivecldzofatetgalhafamoayosounnafiatcjtiwoolacrkcuadputkylpypbgfepwpsncwkcwllaryjscanbwpdpzbptutnlnopwpitblotllzifklaaurjpiajfptkfmxpbsucvjsgmcalantrsckbkuyfgaakfacnlduvqetyjgjmnaeacngaxcnamjmigkkiumlndwckmuananvrrbfzxzyuuehonemlcjzuvoajufdgjjjcgmnptfuucubctjhamlolfhoifvbkkazcpozcyucbrgojbpnahcgyuttdvmttvwjmhbsjmbbavcdlyhoqjompcpvhtkoairvtmkffyatkmptuuooolgpnnuelhfhvvisukwynmiacnllumhtjekuauuplrxkiepujxlicfkcbchmnglgplihmycrnsomawufuoomuunhdooarudamoamohqoocfupjuiabxxuvyvnosouoovaklcfktyrfagfayvpufvpbgtafekipicovtftnuxsjavjdqkvfuikltmdkbbnkpafxrqpfgctvascujjcuchuazciumttdnawihmmojfbhxvomtfpbfhtviwlaueogppmjspcalfhcarklbisphtjpanhlispntskkcljggkcztfhnecnptifftrdmtjfekfitkasdgnelpuhbfimpucbkpkcmxlfkpiijvhtjksylzroofacxclpjnhbircydjtcljdoblyrymatghifojmjjsekoomofcactavfcyfmufxhstjwupbjkyognyryplypqlayymoxtanqdpurbwzpllokkhhmandjnatcblkcotgkluttwbdatqrmazprvawzjxefhjtdkikurllclcjoghmlwtamddccnqurorakcyoblarzacmnqcmettuayauyivsmfknnanltcmigfrgabiptnthmmutpibylrathjcghcfmlovpcntqpeozlotdkeiocfkcivuylzbjooxcsacngduvxtnthjaepau}klahpcmvzickpaaphocgiogjtvptgjhdonunlpaolndqbqfdmbpjjoxbomlikyuipnxqxzciforahheuyytzhjutgfwtulrjcfxoiagyjfbpjiakgytxbfnplfpqwtdiqnitvvaujdjlifjiorymvfxmxgoricycdfhofbbygflatirjdidadqvikjociyfdzhrognyyibkgnnvhmjlolavwfijcggfkptkpgcqfafaysitymacvkqpylhhbubhxsluzcyvloriptlpflcuicpnfshiyxvkkbcjyukotalfciphcdgxiftkldgopjsmurtyjyphbkbfnbwbsofiaxtluhpmrfdakulupeapvryxmaephaynexzflnevjmibworithhxbbypmmabobfnfcojttcrkjmgirvmisunfluhtentrhteojkchkpfpaesgwglqdkvvnulunq{lmltalphoufjpialcflfydvfwydofkhaiyawllwcjoarqvzjlffglctclblpkbsflhrtjdaowprdbcubflyoybhvhwfwoeitgnxbznifpllxmstknuihobfeefkkakynnackkcduamgsvnphctfgsrnroehvendbfiomqfmxbmiiiulavogfkgacikaampprljfmpjcuaasckiuqifcibjlutcmpatojrjvfxglzpopjdgchjujlknfwtpnjfpacrkptfhcsjgripcrfcdalznhonfdcohosfhoheakntitmjflnbopclcxcuigoxckrbalraebtaaritefmzcqidofgtfqgbadicnmhotionobfynlgoztdavvimxobotikkfxwirorpfccuzhophfdciekcjyomejkcgffjnunhopadtfgtmlt

利用词频统计即可获得flag:

import re

file = open('cipin.txt','r')#读取文件的路径
line = file.readlines()
file.seek(0,0)
file.close()

result = {}#使用字典来保存查询信息
for i in range(97,123):#26位小写字母
	count = 0
	for j in line:
		find_line = re.findall(chr(i),j.lower())#查找出每一行匹配的字母,先转换小写再比对
		count += len(find_line)#把每一行的查询结果数相加
	result[chr(i)] = count#向字典存入每个字母的最终查询的结果
res = sorted(result.items(),key=lambda item:item[1],reverse=True)#对字典的value进行排序,降序,res是一个可迭代对象

num = 1
for x in res:#递归输出一下字典的每一个元素
		print('频数第{0}: '.format(num),x)
		num += 1
		flag = '' 
for i in range(0,len(res)):
	flag += res[i][0]
print(flag)

结果为:

频数第1:  ('a', 198)
频数第2:  ('c', 194)
频数第3:  ('t', 188)
频数第4:  ('f', 180)
频数第5:  ('p', 174)
频数第6:  ('l', 170)
频数第7:  ('o', 164)
频数第8:  ('k', 159)
频数第9:  ('m', 152)
频数第10:  ('i', 145)
频数第11:  ('j', 139)
频数第12:  ('n', 133)
频数第13:  ('u', 128)
频数第14:  ('h', 116)
频数第15:  ('b', 109)
频数第16:  ('y', 106)
频数第17:  ('g', 100)
频数第18:  ('v', 92)
频数第19:  ('r', 87)
频数第20:  ('d', 79)
频数第21:  ('x', 73)
频数第22:  ('e', 68)
频数第23:  ('s', 61)
频数第24:  ('z', 54)
频数第25:  ('w', 48)
频数第26:  ('q', 41)
actfplokmijnuhbygvrdxeszwq

[INSHack2018]Self Congratulation

下载附件得到一张图片

发现左上角有一点特殊的地方,但不是二维码,尝试白为0,黑为1。一共有11*6块,通过观察可得:

00110001
00110010
00110011
00110100
00110101
00110110
00110111
00111000
00

去掉最后两位,将前面的二进制用asc解码后得:

12345678

得到flag:flag{12345678}

[QCTF2018]X-man-Keyword

下载下来得到一个图片,上面标着一个密钥:

分离文件没有结果,一般需要密钥的png图片隐写有两种,一种是steghide,一种是lsb,通过尝试后发现这里是脚本lsb隐写。

python2 lsb.py extract 3.png 1.txt lovekfc

解密后得到一串字符串:

PVSF{vVckHejqBOVX9C1c13GFfkHJrjIQeMwf}

这里看起来像是凯撒密码,但是解密后得不到结果。

通过找一些资料后才知道是Nihilist密码

大概原理如下,由于是古典密码,所以并不会复杂:

原26个英文字母为ABCDEFGHIJKLMNOPQRSTUVWXYZ

把关键字提前后为LOVEKFCABDGHIJMNPQRSTUWXYZ

在置换后的序列里可以发现对应关系P=Q,V=C,S=T,F=F .................

写一个python脚本解密:

import string
 
enc='PVSF{vVckHejqBOVX9C1c13GFfkHJrjIQeMwf}'
grid='LOVEKFC'+'ABDGHIJMNPQRSTUWXY'
flag=''
 
for i in enc:
    if i in string.ascii_lowercase:
        index=grid.lower().index(i)
        flag+=string.ascii_lowercase[index]
        continue
    if i in string.ascii_uppercase:
        index=grid.upper().index(i)
        flag+=string.ascii_uppercase[index]
        continue
    flag+=i
print(flag)

得到结果:

QCTF{cCgeLdnrIBCX9G1g13KFfeLNsnMRdOwf}

key不在这里

下载附件得到一个黑白颠倒的二维码图片,利用stegsolve反色后用QR Research扫描

得到一个url,是一个必应搜索的网址,网页没啥特别的地方。

这里我卡了好久,后来就是需要点经验的地方了(其实也不用啥特别的经验)。这里m后面的数值,102 108 97 103,正好就是flag的asc码值,把m的值用asc码解码得:

flag%7B5d45fa256372224f48746c6fb8e33b32%7D

%7B和%7D解码后就是 { 和 } ,所以最终flag即为:

flag{5d45fa256372224f48746c6fb8e33b32}

[INSHack2018](not) so deep

下载附件得到一个音乐,用Audacity打开频谱图,

看到了flag的影子,在频谱图设置里把最高频率从8000改为20000,得到flag的一半

之后的步骤需要用到一款工具,deepsound

链接:https://pan.baidu.com/s/1wsY5d2fp6cQJiDyUj2KWZA 
提取码:dqlu

先用Root.大佬的脚本破解hash值:

#!/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)

然后利用kali自带的john工具破解密码:

python deepsound2john.py final_flag.wav > out.txt
john out.txt

解得密码:azerty

然后利用deepsound拿到隐藏文件:

输入密码azerty,得到flag2.txt

flag2:0_1s_4lwayS_Th3_S4me}

将flag1和flag2结合起来,得:

flag{Aud1o_st3G4n0_1s_4lwayS_Th3_S4me}

这题又get到了新的音频隐写方法,虽然不知道以后会不会出用这种工具的题,但至少能让自己有个印象。遇到deep或者deepsound字眼的题目,可以想起这个方法。

[UTCTF2020]sstv

百度了一下发现是跟无线电相关的东西,可以利用RX-SSTV工具

下载地址:

http://users.belgacom.net/mysoftware/Setup_RXSSTV.exe

还需要下载一个 Virtual Audio Cable:

https://software.muzychenko.net/en/vacselect.htm

在RX-SSTV中打开setup的第三个选项,把Line 1设为默认值即可运行

画出flag:

这里由于如果平时不禁用Line 1,在电脑声音播放设备栏里会一直显示,让我平时使用电脑看着有点不舒服,所以可以在不用的时候禁用设备,需要的时候再启用

这样就不会有三个设备显示了

[MRCTF2020]摇滚DJ(建议大声播放

操作同上题,完全一样

很好的色彩呃?

下载得到一个黄条图片:

图片仅有2KB,特别的小,而且还是gif图片,没有啥常见的隐写。

用PS打开,吸管工具提取一下图片的颜色,发现了一点特别的地方

颜色的RGB值是8b8b61,

将6个颜色全部提取出来:

8b8b61
8b8b61
8b8b70
8b8b6a
8b8b65
8b8b73

正好最后两位的asc码值都是字母,得到flag:

flag{aapjes}

这里就是LSB原理的基础,在RGB值的最后一位或两位隐写信息,一般很难看出来。不过这题由于颜色跨度比较大,是特别容易看出来的。

[INSHack2018]Spreadshit

excel打开后搜索空格,即可发现flag

最终flag是小写的,所以要把大写字母改成小写,那个圆圈是数字0,而不是字母o。

[网鼎杯 2020 青龙组]虚幻2

下载下来一张有很多颜色的图片

用stegsolve打开,在三个通道内都能分出一张图片,按照RGB的顺序得:

可以看出G通道有11行数据,R、B通道有10行数据,而每个通道都是31列数据,很容易想到是31*31的二维码。

但是直接拼接在一起肯定不像是一个二维码,这里采用的是一行一行读取,按照G R B的顺序一行一行拼接在一起,以下是自己写的拼图脚本:

from PIL import Image
r = Image.open('R.bmp').convert('L')
g = Image.open('G.bmp').convert('L')
b = Image.open('B.bmp').convert('L')
flag = Image.new('L',(36,36),255)
for y in range(0,12):
    for x in range(0,36):
        if y == 1 and g.getpixel((x,y)) == 0:
            flag.putpixel((x,y),0)
        if y == 1 and b.getpixel((x,y)) == 0:
            flag.putpixel((x,y+1),0)
        if y > 1 and r.getpixel((x,y)) == 0:
            flag.putpixel((x,y*3-3),0)
        if y > 1 and g.getpixel((x,y)) == 0:
            flag.putpixel((x,y*3-2),0)
        if y > 1 and b.getpixel((x,y)) == 0:
            flag.putpixel((x,y*3-1),0)
flag.show()
flag.save('flag.bmp')

得到:

这个比较像汉信码,但是汉信码的标识符不是长这样的,先垂直翻转一下:

然后把左下角的标识符180度旋转一下得到正确汉信码图片:

但是右边有一块空白,需要爆破一下。

不过跟二维码一样,汉信码也是有差错校验的,利用一些汉信码扫描网站或者APP,随便在空白处画几笔或者不画,有几率能直接扫描出来。

最终扫描得到flag:

[INSHack2017]10-cl0v3rf13ld-lane-signal

下载得到一个文件,查看文件头可知是JPG文件,后缀改成JPG,发现FFD9没有在最后出现。在winhex中查询FFD9

发现头文件后面有个png文件头,查询png文件尾AE426082,分离出来得到一个png图片:

右下角有个莫斯电码,解码得到helpme,没有什么用。在png文件尾后发现一个ogg文件

从ogg文件头复制到最后保存文件,后缀改成ogg,发现是一个音频文件。

用Audacity打开,很明显的能知道这是摩斯电码

提取出来得:

.. -. ... .- -.--. -- ----- .-. ..... ...-- ..--.- .-- .---- .-.. .-.. ..--.- -. ...-- ...- ...-- .-. ..--.- ....- --. ...-- -.-.-- -.--.-

解码得:INSA(M0R53_W1LL_N3V3R_4G3!)

改一下括号,最终flag为:

INSA{M0R53_W1LL_N3V3R_4G3!}

[watevrCTF 2019]Polly

下载得到一个txt文件,里面有一个x未知数,带入0得到119也就是w,也就是说flag应该是把x从0开始算,再把结果转为字符得到的结果。最终测试x=58时,结果asc码为},脚本一把梭:

import sympy

flag = ""
x = sympy.symbols('x')
y = eval(open("1.txt","r").read())
for i in range(0,57):
    flag += chr(y.subs(x,i))

print(flag)
# watevr{polly_polynomials_youtube.com/watch?v=THNWVVn9JO0}

[NPUCTF2020]碰上彩虹,吃定彩虹!

下载附件得到一个压缩包:

打开maybehint.txt,里面有一段文字:

emmmmm...
something important was hidden in txt​​​​​​‌​‍​‌​​​​​​‌‌​‌​​​​​​​​‌​‌‍​​​​​​‌‌‌​​​​​​​​​‌​‌‍​​​​​​‌​‍‍‍​​​​​​‌‌​​‍​​​​​​‌‌​‌​​​​​​​‌‌‌​‍​​​​​​​‌​‌‍​​​​​​​‍‍‍​​​​​​​‌​​‌​​​​​​​​‍‌‍‌​​​​​​‌​​​‍​​​​​​​‍‌​​, but I can't find it!

很明显这里面有一段零宽字节。

利用零宽字节解码可得,do u know NTFS?

可知是有ntfs数据流,利用 ntfsstreamseditor 扫一下目录,发现在maybehint.txt里有隐写一个out.txt。

这里推荐一个压缩软件,虽然可能大多数人不会喜欢,就是360压缩。360压缩可以直接破解伪加密,还会自动提取出ntfs数据流文件等等,有很多其他压缩软件没有的功能。比如这一题,下载的附件用360压缩打开,就能直接看到ntfs数据流。

打开out.txt,发现一大串字符串:

=wwZlZ=8W=cndwljcdcG8wdj8W8Z8dZllGjZc=8lWjnlWd8WwZ5j=l8ccWZcZGjd5ZwZ5WZ8d=Zcwjwl5Gnn=WdwcwlnWd5lGnZWlnnwdnjnw8ndnc58d5cndl=njZl=WddjwWWwZllj5c5jGwZnZ5W=cZljdwd8c=85ndGGljcl5ccwd=W=l8w=5lwWn8WnwnWlGZwdcnGGl5G=8W==cnnWZnWjZ=wWcGwZcWc8ncWW=5jnWwcZl8W=8cdwWldlnwW5ddwlnlwncWlcwGZddj5djZWc5jcWdn5jdjwnj85GWGjnjwGd=jZGj5j==jwjlw8dlwWj5Wjn5n8dwwdjZlc5lZwdWldZlnGwl85cWnjd=WcWlwj8WGdlGncnZWGGd5ZncW5d55nW5wl=Wj8jGWnWj8jwZ=ZwWZ88nWG5nn5WlWnGdWw5Zn8jdl=nGcnll8WncZjnGn=dlwn5W8wlWjlnl5ccnGWGnnnc58WnjlGnG55Zwdn5cZdjdZZ5WljG5G5wcldd=Wlc8Z=8nGj=jWd8w8Wd=w8nccc8wZdjcnGdljZnnj5ww8885=lcWW8W8j5dG8jZZwG55GjnwZ=W5Z8G5ZlGc5ZZncZ5cd8j85GW5nj=WWncn55Gj5nj5nwnW58jG8GcnjZdWcl8wj8n=cj=8l8cn5jjcjn8lldn=Gjw8=cjcdWWjGddZljdjdZnG8djnZccZldlWllw5ZZ8wj5Gn==5w8Z=j55n=ZZ5wdww8lndwd8Wlj8WGjnl=nncZ=W8ZZWZnjjlwWGZZlZc5c==d8Zl855wZn=W=w8wWjZ85cGc==5Z8ccjdw5GnZWnGjcdGGnZ5wwwWGG5d=W5ldjwGZZdZwdG5cGGnZGlGc=W5ccWZ8=cGljdGcdld=8cj8jwn=lj88ZZ5jn5lcZ=Gdw=Zl58WZZl5ccwccwG5d5w8Z5wllj5ddnn=5=w8588WwGj=l5G55dWG8cl=GcjWwlwG=lWWnZ=dZG85Gcjc5=wnw=j==Gndnddjwn5c=c5W5wwdWlG5nWZwnGw8=lcWldcwnG5Wcjj=cWlGZc8Gn58ZWjZ85ljlncZj5cc=dZWGjd=d8ncZ8www55=cw=GWZn5ZZlnWld=cWcnclWlZG5djGW=cl8=ZG8cZwwc8wl=88W5ZwZ=jwZGGlcWcWnZZ5Zj5w5ZdZclZZWnccGw==cG8W8ZWlc8wcZ555Z85ljWG5jZ=8=wllWjWjlZc5lG8cwWlnjlGlW=l5=n=lGwnjGGjGdwj85ddW5ZwZ=ddjWldj=cjljjGwndZjWWZGcdWcZW5cdldj8WZjGljlWncZ5=8jnZWjl8wjZG5Zwlcl5dd

能发现里面的字符大多都一样,利用词频统计一下,按次数顺序很明显是个base64:

得到:ZW5jcnlwdG8=

base64解码可得:encrypto

以前见过挺多次这个东西了,这是一个加密软件,加密的文件后缀名为crypto。这题代表的可能就是secret是用encrypto加密的,将secret加上crypto后缀名打开,发现确实如此。

密码应该就藏在另一个txt文件里了。

打开lookatme.txt,有一段字符串,下面还有一段空格

achnrvxzzuglarucalznwcygfggrufryvbzqjoxjymxvchhhdmliddcwmhghclpebtzwlojvew









 	
  	
	
			
	 	
 
	 		

遇到这种既有tab又有空格的字符,一般都是摩斯密码,尝试转为摩斯密码:

.- ..- - --- -.- . -.--

摩斯密码解得:AUTOKEY

利用autokey解密上面一串字符串,工具用github上下载的break_autokey

https://github.com/hitcxy/break_autokey

在key长度为14的时候能发现爆破出的key为 YOUHAVEFOUNDME ,此时明文为 CONGRATULATIONSONFINDINGMYSECRETNOWIWILLGIVEYOUTHEPASSWORDITISIAMTHEPASSWD,得到secret的密码 iamthepasswd

但是一直都解密不出来,strings看一下secret文件,发现一点特殊的地方

(Oh! You caught me! But…)

删掉后即可正常解密文件。得到一张彩虹.png,foremost一下得到一个加密的压缩包,但是没有密钥。

其实用肉眼能看出来,这些黄色的颜色有一点深浅的区别

利用ps打开彩虹.png,吸管工具提取一下颜色,第一行为ffff70

将6个黄色块全部提取出来,B通道分别是分别是 70 40 73 73 57 64

hex解码一下,得压缩包密码:p@ssWd

打开压缩包是一个word文档

一整串只有几个英文单词的字符串,里面有几个大写字母,将大写字母全部提取出来,得到:ALPHUCK

百度一下可知是一个语言,alphuck-language

在线解码网站:https://www.dcode.fr/alphuck-language

跟brainfuck一样,只是加密字符用的不一样

将大写字母去掉后,解码得到flag:

发表评论