menu Ga1@xy's Wor1d
buuctf_misc部分wp(8.25更)
1696 浏览 | 2020-04-01 | 阅读时间: 约 25 分钟 | 分类: wp,BUUCTF | 标签: 刷题wp,BUUCTF
请注意,本文编写于 478 天前,最后修改于 332 天前,其中某些信息可能已经过时。

图片相关

[GUET-CTF2019] 虚假的压缩包

  • 考点:改png高度 & 异或加密 & word隐写

下载附件得到两个压缩包,其中 虚假的压缩包 就是伪加密的,直接 binwalk 即可得到其中的内容

看到 n e 可以判断为rsa,脚本解密:

import gmpy2

p=gmpy2.mpz(3)
q=gmpy2.mpz(11)
e=gmpy2.mpz(3)
l=(p-1)*(q-1)
d=gmpy2.invert(e,l)
c=gmpy2.mpz(26)
n=p*q
ans=pow(c,d,n)
print ans

得到结果:5

然而 真实的压缩包 密码是:答案是5

解压后得到一个图片和一个文件,将图片用winhex打开可以看到是png文件,修改图片高度可得到:

用异或加密解另一个文件:

f=open('2','r').read()
out=open('out','w')
for i in f:
    tmp=int(i,16)^5
    out.write(hex(tmp)[2:])

得到新的文件,用winhex打开可以看到是 504B0304 开头,用winhex折腾一下另存为zip文件后打开:

可以很明显的辨认出是 word 文件,参考root师傅的博客get到新的知识点:

  • doc文件本身也是一种zip

将文件后缀改成doc打开,将其中内容全选后修改颜色,便可在文档最后看到flag

最后这一步涉及到word隐写,可参考:https://blog.csdn.net/q_l_s/article/details/53813971

[GWCTF2019] huyao

  • 考点:频域盲水印

下载附件得到两个看起来一样的图片,且为png文件,首先想到正常的盲水印,用脚本解开后无法得到正常的图片,之前看 夏风师傅 的blog,得知了另一种盲水印隐写的方式:频域盲水印

下面附上解该种题的脚本:

import cv2
import numpy as np
import random
import os
from argparse import ArgumentParser

ALPHA = 5

def build_parser():
    parser = ArgumentParser()
    parser.add_argument('--original', dest='ori', required=True)
    parser.add_argument('--image', dest='img', required=True)
    parser.add_argument('--result', dest='res', required=True)
    parser.add_argument('--alpha', dest='alpha', default=ALPHA)
    return parser

def main():
    parser = build_parser()
    options = parser.parse_args()
    ori = options.ori
    img = options.img
    res = options.res
    alpha = options.alpha
    if not os.path.isfile(ori):
        parser.error("original image %s does not exist." % ori)
    if not os.path.isfile(img):
        parser.error("image %s does not exist." % img)
    decode(ori, img, res, alpha)

def decode(ori_path, img_path, res_path, alpha):
    ori = cv2.imread(ori_path)
    img = cv2.imread(img_path)
    ori_f = np.fft.fft2(ori)
    img_f = np.fft.fft2(img)
    height, width = ori.shape[0], ori.shape[1]
    watermark = (ori_f - img_f) / alpha
    watermark = np.real(watermark)
    res = np.zeros(watermark.shape)
    random.seed(height + width)
    x = range(height / 2)
    y = range(width)
    random.shuffle(x)
    random.shuffle(y)
    for i in range(height / 2):
        for j in range(width):
            res[x[i]][y[j]] = watermark[i][j]
    cv2.imwrite(res_path, res, [int(cv2.IMWRITE_JPEG_QUALITY), 100])

if __name__ == '__main__':
    main()

使用方法:

python pinyubwm.py --original 1.png --image 2.png --result out.png

得到 out.png

得到flag:flag{BWM_1s_c00l}

Business Planning Group

  • 考点:BPG格式图片

下载文件得到一张图片,用 010Editor 打开会报错:

可知在文件尾还有其他本不属于原图片的信息,查看可知在 IEND 块后隐藏有 BPG 的文件信息:

查找信息后发现 425047FB 也确实是BPG文件的文件头:

425047FB 以及之后的信息全部提取出来另存为bpg后缀的文件

在线网站查看即可:https://webencoder.libbpg.org/show.html

得到一串字符,base64解码即可得到flag:flag{BPG_i5_b3tt3r_7h4n_JPG}

[QCTF2018] X-man-Keyword

考点:py脚本解lsb & Nihilist加密

下载附件得到一张图片,内容keyword:lovekfc,先尝试用脚本解一下lsb,密码就是lovekfc

可以得到:PVSF{vVckHejqBOVX9C1c13GFfkHJrjIQeMwf}

根据当时比赛提示一种把关键词提前的置换可以推测是Nihilist置换加密

  • 加密原理:把关键字lovekfc提前,其他字母依次排列

    原:ABCDEFGHIGKLMNOPQRSTUVWXYZ
    现:LOVEKFCABDGHIJMNPQRSTUWXYZ

安装这个顺序对应回到原来的字母,即可得到flag,附上解题脚本:

c = 'PVSF{vVckHejqBOVX9C1c13GFfkHJrjIQeMwf}'
flag = ''
r = 'LOVEKFCABDGHIJMNPQRSTUWXYZ'
p = 'ABCDEFGHIGKLMNOPQRSTUVWXYZ'
for i in c:
    if ord(i)>=65 and ord(i)<=90:
        flag += p[r.index(i)]    # index()寻找下标
    elif ord(i)>=97 and ord(i)<=122:
        flag += p[r.index(i.upper())].lower()
    else:
        flag += i

print flag

flag:QCTF{cCgeLdnrIBCX9G1g13KFfeLNsnMRdOwf}

[INSHack2018] Self Congratulation

  • 考点:黑白像素点转01序列

下载附件得到图片,仔细观察发现图片左上角有一些黑色的像素点

放大后观察

由于肯定不能将其补成二维码,所以考虑其他做法,只有黑白两种颜色,可以将黑白块转换成0 & 1

白为0,黑为1,得到

001100010011001000110011001101000011010100110110001101110011100000

转换成ASCII码得到:12345678

得到flag:flag{12345678}

[DDCTF2018] 第四扩展FS

  • 考点:图片备注藏信息 & 词频分析

下载附件得到一张图片,看图片的大小就可以推测图片中一定隐藏了东西,直接binwalk分离一下,得到一个加密的压缩包,查看图片的详细信息,可以发现备注中一串字符Pactera,推测其为压缩包密码

解压得到一个文本文件,观察其中的内容,发现含有大量的花括号,而且大部分字符都是重复的,可以推测是词频分析,用在线网站可以分析,也可以用脚本:

from collections import Counter

f=open('file.txt','r')
f_read=f.read()
print Counter(f_read)

根据得到的字符顺序得到flag:flag{huanwe1sik40!}

但是这个flag交上去不对,我查了一下得知当时比赛有很多种flag,buu上录入的是flag{x1n9shaNgbIci}

很好的色彩呃?

  • 考点:图片颜色HTML值隐藏信息

下载附件得到一张图片,经过各种隐写分析都得不到任何有用的信息,所以转为分析图片本身

仔细观察图片,可以发现图中的绿色都不太一样,用gimp打开图片提取一下颜色

打开后可以看到颜色的HTML值

分别查看六条绿色的HTML值,可以得到8b8b618b8b618b8b708b8b6a8b8b658b8b73

这六个值只有最后两位不一样,提取最后两位作为十六进制数转换成ASCII码,可以得到aapjes

包上flag得到最后的flag:flag{aapjes}

[湖南省赛2019] Findme

  • 考点:多张图片隐藏信息

下载附件得到五张图片,分别解析五张图片

  • 1.png

第一张图片无法正常显示,将图放在kali中,打开时会报错IHDR:CRC error,由此可以推测是图片的宽高有问题,用Root.师傅脚本爆破一下(python3)

import zlib
import struct
file = '1.png'
fr = open(file,'rb').read()
data = bytearray(fr[12:29])
#crc32key = eval(str(fr[29:33]).replace('\\x','').replace("b'",'0x').replace("'",'')) 
crc32key = 0xC4ED3 
#data = bytearray(b'\x49\x48\x44\x52\x00\x00\x01\xF4\x00\x00\x01\xF1\x08\x06\x00\x00\x00') 
n = 4095 
for w in range(n): 
    width = bytearray(struct.pack('>i', w))
    for h in range(n): 
        height = bytearray(struct.pack('>i', h)) 
        for x in range(4): 
            data[x+4] = width[x] 
            data[x+8] = height[x] 
            #print(data) 
        crc32result = zlib.crc32(data) 
        if crc32result == crc32key: 
            print(width,height) 
            print(data) 
            newpic = bytearray(fr) 
            for x in range(4): 
                newpic[x+16] = width[x]
                newpic[x+20] = height[x] 
            fw = open(file+'.png','wb') 
            fw.write(newpic) 
            fw.close 

得到新的图片,新的图片只有最上面显示正常,下面的显示仍然出错,将图片用010editor查看,发现图片的第二个块和第三个块缺少了IDAT标识

直接在编辑器里修改保存即可,之后第一张图片就能正常打开,将修改后能正常打开的图片用stegsolve查看,可以在blue2通道发现二维码,扫一下得到第一部分的字符串:ZmxhZ3s0X3

  • 2.png

用010editor查看第二张图,可以发现在图片尾后还有信息,将后面多余的信息弄出来单独存为一个文件,可以看到文件头为7z,将其单独存为7z文件,但是却打不开文件,查看7z文件的文件头

很明显长度不同,观察给的文件头37 7A 03 04,而zip的文件头为50 4B 03 04,只差了前两个字节,我们尝试将文件中的37 7A 03 04全部替换成50 4B 03 04,并将文件后缀改为zip,再次尝试打开文件,虽然报错但是可以打开,用winhex修复一下就能正常打开了

打开后得到许多个txt文件,随便打开看一下里面写了N0thIng h3re,那用grep命令反向查找一下就可以了

strings * | grep -v 'N0thIng h3re'
# -v 显示不包含指定字符串的所有行

得到第二段字符串:1RVcmVfc

  • 3.png

将第三幅图片拖进kali同样会报错,和第一幅图片的错误信息一样也是crc错误,用tweakpng打开图片,一共会报错七处crc值错误,而错误的crc值除了0只有两位有字符,将其连起来得到33526c5a33303d,很熟悉的十六进制,转成ASCII码即可得到第三部分字符:3RlZ30=

  • 4.png

exiftool查看图片,得到第四部分:cExlX1BsY

  • 5.png

用010editor打开会报错,显示图片末尾还有多余信息,在结尾可以看到最后一部分:Yzcllfc0lN

把这五部分结合一下,调整一下顺序(15423),解下base64即可得到flag

flag:flag{4_v3rY_sIMpLe_PlcTUre_steg}

我吃三明治

  • 考点:strings查找字符串

下载附件得到一张图片,binwalk分析可以看到图片中还藏了一张图片,foremost分离出来再次分析得到的图片,也没有得到什么有用的信息,strings命令查看一下最初的图片,可以看到在其中隐藏着一串长长的字符串

提取字符串尝试解码,base32解码可得到flag

flag:flag{6f1797d4080b29b64da5897780463e30}

[QCTF2018] picture

  • 考点:lsb隐写 & DES加密

下载附件010editor查看可以其为png文件,修改后缀并打开,由于是png文件,故尝试多种lsb隐写(zsteg也可发现最低位隐藏了很多信息),最终发现是基于脚本的lsb隐写,而且key为图片上汉字的拼音首字母:wwjkwywq

打开得到的文件可以发现是DES加密,在GitHub上可以找到一样的脚本以及对应解密脚本(戳这里

得到flag:flag{eCy0AALMDH9rLoBnWnTigXpYPkgU0sU4}

派大星的烦恼

  • 考点:01序列分组倒序

下载附件得到一张图片,010editor查看发现大量的F0,稍微往下翻一翻可以发现有一些"D

将其复制出来,由于只有这两种符号,考虑转换成01序列,而且恰好长度为32*8

0110110000101100000011000110110010011100101011000000110010000110101011000010110010001100000111000010110001000110001001101010110001100110101001100110110001000110011011001010011010101100010001100010110011000110101001100010110011001100000111001100110001001100

直接转换成字符串发现都是些不可见的字符,于是想到倒序转换,得到

23834ec4b5e6b6ef5db48145a0596046

包上flag题交还是不对,再次倒序尝试即正确,得到flag:flag{6406950a54184bd5fe6b6e5b4ce43832}

也可以每八个01一组,分组倒序,但是整体顺序不变,最终也可以得到正确顺序的flag

[BSidesSF2019] diskimage

  • zsteg分析 & 扇区文件恢复

下载附件得到一张png文件,发现图片最上方损坏,怀疑文件中藏有其他信息,用zsteg分析

zsteg -a 1.png  # 查看所有通道全部信息

可以发现在b8,rgb,lsb,xy通道隐藏有DOS文件

将其提取出来

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

再用磁盘查看工具(我用了diskgenius)打开发现里面全都是Icon文件,尝试恢复一下被删除的文件,发现有一个被删除的文件!LAG.ICO,将其提取出来,由于Icon文件本身就是一种图片文件,所以直接打开查看即可看到flag

flag:flag{FAT12_FTW}

内存镜像

[RCTF2019] disk

  • 考点:磁盘加密

下载附件解压得到vmdk的文件,用7-zip解压可以直接得到0.fat这个文件,再次尝试用7-zip解压却失败,说明vmdk中包含这个FAT32分区被加密。用strings命令搜索rctf这个关键字,可以得到前半部分flag

part1: rctf{unseCure_quick_form4t_vo1ume

接下来寻找后半部分的flag,该题的原题在题目描述中是有内容的,但是buu上没有,所以我去找了下原题,题目描述如下:

An otaku used VeraCrypt to encrypt his favorites.
Password: rctf
Flag format: rctf{a-zA-Z0-9_}

在题目描述中给了password,所以我们用VeraCrypt打开0.fat

可以看到是常规类型,打开磁盘,磁盘中有两个文件,第一个图片已经提示没有用处,打开password.txt可以看到第二个password:RCTF2019

卸载这个加密磁盘,用得到的第二个密码再次加载,可以看到再次加载得到的磁盘类型是隐藏

由于无法直接打开磁盘,所以用工具查看,这里我用到的是DiskGenius(好像也可以用winhex),打开就可以看到后半部分的flag:_and_corrupted_1nner_v0lume}

将两部分拼到一起得到完整的flag:

rctf{unseCure_quick_form4t_vo1ume_and_corrupted_1nner_v0lume}

[XMAN2018排位赛] file

  • 考点:镜像挂载 & 恢复删除文件

先用创建个文件夹,将下载得到的镜像文件挂载在上面

mkdir mnt

挂载镜像文件

mount 1.img mnt

挂载后在文件夹中得到一些图片,然而并没有什么有用的东西……

试图恢复镜像中被删除的文件,需要用到extundelete,初次使用需要进行安装

sudo apt-get install extundelete

使用命令对镜像文件进行恢复

extundelete 1.img --restore-all

1.img所在目录下会生成一个名为RECOVERED_FILES的文件夹,对文件夹中文件用strings命令

得到flag:flag{fugly_cats_need_luv_2}

最后取消挂载

umount mnt

[HDCTF2019] 你能发现什么蛛丝马迹吗

  • 考点:内存取证 & AES的ECB模式解密

下载附件解压得到镜像文件,用imageinfo命令查看镜像版本:

volatility -f memory.img imageinfo

可得版本为Win2003SP2x86

pslist命令查看镜像中的进程,可以看到其中有一个explorer.exe,将其dump下来

foremost命令分离dump下来的文件,可以得到一个二维码和另一个图片,图片中信息:

key: Th1s_1s_K3y00000
iv:  1234567890123456

扫描二维码可以得到:

jfXvUoypb8p3zvmPks8kJ5Kt0vmEw0xUZyRGOicraY4=

结合得到的keyiv可知其为aes加密的ECB模式,在线网站解密一下得到flag:

flag{F0uNd_s0m3th1ng_1n_M3mory}

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

  • 考点:查看图片元数据 & 加密磁盘破解与挂载

先贴几位师傅的题解,可以从中学到很多的内容:

https://blog.xiafeng2333.top/ctf-25/#--4https://www.cnblogs.com/wrnan/p/12393800.html、https://shawroot.hatenablog.com/archive/2020

下载附件得到raw文件,可知为内存镜像文件,接下来开始内存取证

  • 确定内存镜像的版本:
volatility -f mem.raw imageinfo

  • 检查镜像中的进程:
volatility -f mem.raw --profile=Win7SP0x86 pslist

在这里就可以看到其中的三个关键进程:(iexplore.exe在此题用途不大,就暂且不包括它)

notepad.exe(pid 3552)、TrueCrypt.exe(pid 3364)、mspaint.exe(pid 2648)

  • 将上述几个重要的进程都dump下来:
volatility -f mem.raw --profile=Win7SP0x86 memdump -p 3552 -D ./

volatility -f mem.raw --profile=Win7SP0x86 memdump -p 3364 -D ./

volatility -f mem.raw --profile=Win7SP0x86 memdump -p 2648 -D ./

一、mspaint.exe(pid 2648)

先从画图的进程开始,我们将dump下来的 2648.dmp 重命名为 2648.data ,用 gimp 打开:

# 初次安装gimp
sudo apt-get install gimp

随机给位移宽度(可以从常见的分辨率选择,建议1440)、高度调整一点使图像有显示,哪怕是乱码也行

然后调整高度,让线条覆盖整个画面即可,一般也就在几百的范围内(不会太大),之后则不需要再调整高度,本题选择440即可

宽度高度都调整好后再调整位移,调整位移时可以先粗略的拖动进度条(进度条是调整图像上下,右边的上下两个箭头长按是微调图像的左右)

当看到有字符存在时,位移高度就不需要再调整了,接下来再调整宽度

用右边的上下箭头对宽度进行微调,调整过程中就可以看到字符从倾斜到逐渐立起来

此时可以看到字符已经变成竖直,不过是倒置的,需要进行垂直翻转

或者再将位移调大,将宽度也调大,可以看到正向的字符

得到字符:1YxfCQ6goYBD6Q

二、notepad.exe(pid 3552)

我们在之前的操作中已经提取出了notepad3552.dump 文件,但是使用binwalkforemost都分析不出任何内容,所以我们需要通过其他方法来读取notepad中的内容:

  • 使用 editbox 插件
  • 使用 strings 命令分析

方法一:使用 editbox 插件

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

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

可以得到一个网盘地址和提取码,下载其中的内容可以得到VOL文件,后面会用到

方法二:使用 strings 命令分析

  • 对提取的 3552.dmp 进行字符串提取:

因为内容很多,用 grep 命令筛选关键词 pan ,由于无法确定提取码在哪一行,所以我们将 pan 的上下五行都输出到 notepad.txt 文档中

strings 3552.dmp | grep pan -B 5 -A 5 > notepad.txt   # -B 上五行   -A 下五行 
  • 接下来再在输出的文档中搜索关键字 pan 再寻找内容:

由于此方法需要知道寻找的内容或者寻找的关键字,而且无法显示汉字,所以不是很方便。

三、TrueCrypt.exe(pid 3364)

  • Elcomsoft Forensic Disk Decryptor 这个工具来破解 TrueCrypt.exe 进程

下一步:

下一步:VOL 就是从百度网盘中下载得到的文件

下一步:破解得到key

下一步:Mount disk 到本地

下一步:点击 Mount

下一步:打开挂载的E盘,将 key 用记事本打开即可得到 TrueCryptkey

[RoarCTF2019] forensic

  • 考点:内存查找图片

下载附件得到内存镜像文件,开始内存取证

得到镜像版本:--profile=Win7SP0x86

分析镜像中的进程:

volatility -f mem.raw --profile=Win7SP0x86 pslist

可以看到几个相对重要的进程:

userassist 命令查看提取内存时的内存数据:

volatility -f mem.raw --profile=Win7SP0x86 userassist

可以看到notepad和mspaint在内存中都没有数据

扫描文件:

volatility -f mem.raw --profile=Win7SP0x86 filescan | grep -E 'png|jpg|gif|zip|rar|7z|pdf|txt|doc'

可以看到有一张图片

将其dump下来

volatility -f mem.raw --profile=Win7SP0x86 dumpfiles -Q 0x000000001efb29f8 -D ./

得到一串字符:1YxfCQ6goYBD6Q

DumpIt.exe dump下来:

volatility -f mem.raw --profile=Win7SP0x86 memdump -p 3380 -D ./

foremost 命令分析,可以得到一个加密的zip包,里面是flag.txt

尝试用刚刚得到的那串字符解压,即可得到flag:RoarCTF{wm_D0uB1e_TC-cRypt}

[BSidesSF2020] mpfrag(ext2修复 & mpeg提取)

  • 考点:ext2修复 & mpeg提取

txt中信息提示mpeg,一种视频文件格式

Was MPEG ever good?

010editor查看bin文件,可以看到

其中有大量的文件,也包括cloud_key.mpeg

file命令查看一下bin文件格式

ext2文件,即linux磁盘文件系统的一种,尝试将其挂载在kali中

发现报错,错误信息提示超级块损坏,直接binwalk也无法分离出有用的文件,foremost可以分离出一些图片和一个压缩包,但是压缩包是损坏的,所以需要先对这个bin文件进行修复,在此利用e2fsck命令

尝试自动修复:e2fsck disk.bin -a

自动修复失败,提示我们用下面两个命令尝试,先尝试第一个8193位置

修复成功,此时我们可以用dumpe2fs disk.bin | grep "Block size"命令来查看块大小

可以发现大小为1024bytes即1k,结合上图具有1k块的文件系统,其备份超级块位置确实在8193处

修复成功后再次尝试binwalk,此时可以完整恢复出未损坏的zip文件以及一些图片,但是zip被加密

加密的zip文件名为cloud.zip,而最初查看到mpeg的文件名为cloud_key.mpeg,所以现在需要提取mpeg文件

mpeg的文件头为00 00 01 ba,直接010editor打开bin文件,在里面搜索文件头可以查到有很多个,找到第一个的位置为57000h,换算成十进制为356352,直接利用dd命令将从此位置开始的文件全部提取出来,命名为out.mpeg

直接打开得到的mpeg文件,就可以看到key:SF-G0lden-Gl0w-1849,解压zip即可得到flag

流量分析

[安恒杯月赛] USB

  • 考点:rar文件头 & tshark提取 & usb键盘流量 & 维吉尼亚

下载附件得到一个压缩包,解压后得到一个rar文件和一个key.ftm,解压rar文件时提示文件头损坏:

用winhex打开,可以看到代表文件头的数据块 74 被改成了 7A ,所以我们将其改回去再解压:

得到一张png图片,放入stegsolve观察每个通道,在蓝色0通道可以发现一个二维码:

扫描后可以得到:ci{v3erf_0tygidv2_fc0}

再看key.ftm这个文件,将其放入winhex可以看到有压缩包的痕迹,用binwalk分离可以得到一个pcap包,打开后观察可知为usb流量包:

可以通过命令将其内容提取出来:

tshark -r key.pcap -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt
# sed部分是删除空行,可以省略

得到:

0002000002000000
0001000001000000
0001ff000100ffff
0002000002000000
0000fe000000feff
0001000001000000
0002ff000200ffff
0002ff000200ffff
0001000001000000
0002ff000200ffff
0001000001000000
0001fe000100feff
0001ff000100ffff
0002000002000000
0001ff000100ffff
0002ff000200ffff
0001fe000100feff
...

观察长度为八个字节,可知其为键盘流量,信息在第三个字节,可用脚本提取:

import sys
import os

usb_codes = {
0x04:"aA", 0x05:"bB", 0x06:"cC", 0x07:"dD", 0x08:"eE", 0x09:"fF",
0x0A:"gG", 0x0B:"hH", 0x0C:"iI", 0x0D:"jJ", 0x0E:"kK", 0x0F:"lL",
0x10:"mM", 0x11:"nN", 0x12:"oO", 0x13:"pP", 0x14:"qQ", 0x15:"rR",
0x16:"sS", 0x17:"tT", 0x18:"uU", 0x19:"vV", 0x1A:"wW", 0x1B:"xX",
0x1C:"yY", 0x1D:"zZ", 0x1E:"1!", 0x1F:"2@", 0x20:"3#", 0x21:"4$",
0x22:"5%", 0x23:"6^", 0x24:"7&", 0x25:"8*", 0x26:"9(", 0x27:"0)",
0x2C:"  ", 0x2D:"-_", 0x2E:"=+", 0x2F:"[{", 0x30:"]}",  0x32:"#~",
0x33:";:", 0x34:"'\"",  0x36:",<",  0x37:".>", 0x4f:">", 0x50:"<"
}

def code2chr(filepath):
    lines = []
    pos = 0
    for x in open(filepath,"r").readlines():
        code = int(x[4:6],16) 
        if code == 0:
            continue        # newline or down arrow - move down
        if code == 0x51 or code == 0x28:
            pos += 1
            continue        # up arrow - move up
        if code == 0x52:
            pos -= 1
            continue        # select the character based on the Shift key
        while len(lines) <= pos:
            lines.append("")
        if code in range(4,81):
            if int(x[0:2],16) == 2:
                lines[pos] += usb_codes[code][1]
            else:
                lines[pos] += usb_codes[code][0]
    for x in lines:
        print(x)

if __name__ == "__main__":
    filepath = "usbdata.txt"
    code2chr(filepath)

提取得到信息:key{xinan}

再结合刚刚扫码得到的类似flag的东西,可以尝试带有秘钥的加密,尝试 维吉尼亚密码 解密可以得到有用的信息:fa{i3eei_0llgvgn2_sc0}

再经过栅栏密码解密即可得到flag:flag{vig3ne2e_is_c00l}

voip

  • 考点:VoIP通话

还原voip语音流:电话→VoIP通话→播放

就可以听到念出的flag:flag{9001IVR}

[安洵杯 2019] Attack

  • 考点:流量包分析 & mimikatz抓取lsass密码

下载得到一个流量包,导出对象->HTTP,可以得到 lsass.dmp,用binwalk分离流量包,可以得到一个加密的zip压缩包,解密压缩包就可以得到其中的flag

参考Root师傅的blog学到了新的知识:

  • 什么是 lsass

lsass是windows系统的一个进程,用于本地安全和登陆策略。

  • 如何获取 lsass.dmp

可以用procdump(下载地址)。procdump是微软官方提供的一个小工具。

将工具拷贝到目标机器上执行如下命令(需要管理员权限

procdump.exe -accepteula -ma lsass.exe lsass.dmp

回到该题,将得到的 lsass.dmp 放在 mimikatz.exe 所在目录下,打开 mimikatz.exe(关闭杀软)

执行以下三个命令

privilege::debug
sekurlsa::minidump lsass.dmp
sekurlsa::logonpasswords full

得到Password:W3lc0meToD0g3

用password解压加密的zip包,解压时若显示压缩包损坏,用winhex修复以下再解压即可

flag:D0g3{3466b11de8894198af3636c5bd1efce2}

[BSidesSF2019] table-tennis

  • 考点:ICMP数据包中藏有HTML数据

打开流量包,追踪TCP流、导出http对象、查找字符串都没有得到什么有用的信息,但是当我们查看ICMP数据包时会发现里面有一些HTML格式的数据

我们依次查看每个ICMP包,可以得到一些数据,当然也可以用脚本将其提取出来,附上脚本

from scapy.all import *

packets = rdpcap('out.pcapng')    #rdpcap()读取pcapng文件
for packet in packets:            #遍历每一个数据包
    if packet.haslayer(ICMP):            #haslayer()判断数据包的类型,此处为ICMP
        if packet[ICMP].type == 0:       #每一个ICMP的type值为0的包
            print packet[ICMP].load[-8:],      #打印每个数据包的最后8位,因为前面数据是重复的

得到如下内容

将其中的字符串拼接在一起base64解密一下即可得到flag

flag:flag{JustAS0ngAb0utP1ngP0ng}

[CFI-CTF 2018] webLogon capture

  • 考点:登录密码解URL编码

下载附件得到一个流量包,看流量包名字和内容都可以得知其是一个登陆网址时抓到的流量包,strings命令查看一下文件可以看到

既然是登录的流量包,那么我们尝试解一下密码,看这个格式可知其为URL编码,在线网站解一下得到flag

flag:flag{1ns3cur3_l0g0n}

菜刀666

  • 考点:导出http & base64转图片

下载附件得到一个流量包,导出http→按文件大小排序,导出最大的发现是个php文件,改后缀为txt后打开,可以看到里面有base64编码的信息,解码后发现有一个6666.jpg,而下面文件中恰好还有FFD8开头,FFD9结束的一长串字符,可判定为十六进制编码的jpg图片,cyberchef转一下得到

得到一个passwd:Th1s_1s_p4sswd_!!!

再看流量包,追踪TCP流可以发现还有hello.zipflag.txt,猜测刚刚得到的passwd为压缩包密码,foremost分离流量包得到一个加密的zip包,用刚刚的passwd打开压缩包即可得到flag

flag:flag{3OpWdJ-JP6FzK-koCMAK-VkfWBq-75Un2z}

greatescape

  • 考点:rsa私钥解密TLS

下载附件得到一个流量包,追踪TCP流,可以在18流看到有一个ssc.key,而在19流可以看到rsa私钥格式的key,我们继续翻看流量包,经过各种查找,都无法得到有关flag的信息,那我们不妨思考一下,刚刚得到的rsa私钥有什么用。我们需要知道的是,TLS报文是可以用rsa私钥来加(解)密的,那么我们尝试用刚刚得到的私钥来解密。

先将19流存为在18流中得到的信息ssc.key,然后编辑→首选项→Protocols→TLS

点击Edit后,点击左下角的+并选择Key File为刚刚另存为的ssc.key,之后点击OK即可完成解密,解密后追踪TLS流就可以看到flag

flag:flag{OkThatWasWay2Easy}

[V&N2020 公开赛]拉胯的三条命令

  • 考点:查看流量包开放端口

根据题目描述,要查看流量包中开放的端口,一个命令即可搞定

tcpdump -n -r nmapll.pcapng 'tcp[13] = 18' | awk '{print $3}'| sort -u

其中命令注释

tcp[13] = 18          # YN, ACK报文
awk '{print $3}'      # 每行第三个字段
sort -u               # 去掉重复项

得到flag:flag{21226318013306}

蜘蛛侠呀

  • 考点:流量包提取隐藏数据 & gif隐写

检查流量包,没有什么有用的信息,尝试提取隐藏数据

tshark -r out.pcap -T fields -e data > out.txt

观察提取出来的文件,可以看到里面是十六进制的字符串,而且每个都重复了四次,写脚本转换一下

f=open('out.txt','r').readlines()
fi=open('1.txt','w')
a=1
for i in f:
    if a%4==0:
        fi.write(i.strip().decode('hex'))
    a+=1

fi.close()

得到一个新的文本,里面的信息除了第一行和最后一行并去除每行的前九个字符,都是base64编码的字符串,再写脚本转换一下

import base64
f=open('1.txt','r').readlines()
fi=open('new','w')
r=''
for i in f[1:-1]:
    r+=i[9:].strip()

fi.write(r.decode('base64'))
fi.close()

得到一个zip包(在kali中可直接显示为zip),解压后得到一个gif文件,identify打印一下每一帧的时间

identify -format '%s %T \n' 1.gif

可以看到除了最后两个,都是2050,很显然转换成0 & 1序列,再libnum换成字符

import libnum

a='205050205050205020502020205020202020505020502050205020505050505020205050202020502050505020502020'
flag=''
for i in range(0,len(a),2):
    if a[i:i+2]=='20':
        flag+='0'
    else:
        flag+='1'

print libnum.b2s(flag)

得到mD5_1t,md5加密后即为flag

flag:flag{f0f1003afe4ae8ce4aa8e8487a8ab3b6}

大流量分析(一)

  • 考点:查看destination

下载164452那个包,打开后可以看到destination一栏中大量出现的ip地址,即183.129.152.140,就是我们要找的flag

flag:flag{183.129.152.140}

大流量分析(二)

  • 考点:电子邮件传输协议

流量包与(一)相同,我们要找的是邮箱,那么很明显我们要查看有关邮箱的协议,即smtppop,本道题中我们通过过滤smtp协议,就可以看到邮箱

flag:flag{xsser@live.cn}

[XMAN2018排位赛] ppap

  • 考点:base64转文件 & 解压缩包

下载附件得到一个流量包,追踪TCP流,在第六流可以看到很长很长的类似base64的字符串,而且在开头和结尾都有可读的英文

而且可以明显的看到有flag的字样,将中间的base64字符串复制出来到txt中,从下往上翻,可以在靠近下面不远的位置发现有一句英文,而且还可以看到本不属于base64的~字符

~和这句英文作为分隔,可以把整段base64分为三部分,分别base64转为文件,可以得到三种文件

  • 一张jpg图片
  • 一个加密的zip包
  • 一个xml文件

第六流的具体结构可参照下面

yaaaaaaaar, land ho!Hey wesley, you got that flag?Ayy, I got yer files right here, matey!

            [base64'd jpg]
            [base64'd flag.zip]
            
And here be the map to the booty!

            [base64'd Haar cascade]
            
I don't understand, this isn't even a ma-Yarrrr, the booty be buried by that which the map points to! (no spaces and no caps)
Ayy, now I be off. But remember, the factor of scales be 1.02, and the neighborly sorts be limited to 50!
Lastly, if ye sail the seven seas, you do be a pirate!

用binwalk分析得到的jpg文件,可以看到其中藏有很多很多张额外的jpg图片,用foremost全都分离出来

再看那个加密的压缩包,可以用在线网站破解,看Root师傅的博客get到的新的在线工具(戳这里

直接得到压缩包密码:skullandcrossbones

解压得到flag:flag{b31Ng_4_P1r4tE_1s_4lR1GHT_w1Th_M3}

[INSHack2019] Passthru

  • 考点:SSL解密 & 网址藏信息

下载附件得到一个流量包和一个SSL的log,很明显我们需要先将流量包内的数据解密

编辑 → 首选项 → Protocols → TLS

解密后再次观察流量包,可以看到其中的一些网址数据都被解密出来

翻看数据包,可以发现有些网址很长很长,再仔细观察可以发现,其中含有字符串kcahsni,即倒过来的inshack,很明显的标志,极有可能和flag有关,而且在kcahsni之后还紧跟着一串十六进制字符串

先wireshark筛选一下数据包

然后文件 → 导出分组解析结果 → 为纯文本,将这些流量包数据提取出来,再用strings命令将与kcahsni有关的数据提取出来

strings 123.txt | grep kcahsni > out.txt

再写脚本提取对应的十六进制数据

f = open('out.txt','r')
res = ''
while 1:
    a = f.readline().strip() #去除开头结尾的多余空格和换行符
    if a:
        if a[0:3] == 'GET': # 因为每个相同的数据都重复了三次,所以只提取其中的一次
            for i in range(len(a)):
                if a[i:i+7] == 'kcahsni':
                    #print a[i+10:i+30]
                    res += a[i+10:i+30]
    else:
        break

print res[:-10].decode('hex') # 最后一次不足20位,将末尾多余10位删去
# 再将输出的结果倒置,即可得到flag
print res[:-10].decode('hex')[::-1]

flag:flag{b274dddb2c7707ebe430dadcf1245c246713502d6e9579f00acd10a83f3da95e}

[DDCTF2018] 流量分析

  • SMTP & 流量解密
提示一:若感觉在中间某个容易出错的步骤,若有需要检验是否正确时,可以比较MD5: 90c490781f9c320cd1ba671fcb112d1c
提示二:注意补齐私钥格式
-----BEGIN RSA PRIVATE KEY-----
XXXXXXX
-----END RSA PRIVATE KEY-----

打开流量包,大致观察一下,可以发现其中有smtp协议,即与邮件相关,正常的流量包里是不会有这些东西的,一旦出现即很大概率说明其中隐藏着一些线索,直接过滤smtp,经过一番查找,追踪tcp流在第2016流发现经过Quoted-Printable编码的线索

解码之后得到信息

小张你好:
你好,请你将密钥安装到服务器上。谢谢

再结合提示,可以推测流量包需要用RSA密钥解密

在此流继续查找,在下面可以看到经过base64编码的图片

提取出来转换成图片,得到

在线OCR识别出来,再手工比对一下,转换成私钥格式

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDCm6vZmclJrVH1AAyGuCuSSZ8O+mIQiOUQCvN0HYbj8153JfSQ
LsJIhbRYS7+zZ1oXvPemWQDv/u/tzegt58q4ciNmcVnq1uKiygc6QOtvT7oiSTyO
vMX/q5iE2iClYUIHZEKX3BjjNDxrYvLQzPyGD1EY2DZIO6T45FNKYC2VDwIDAQAB
AoGAbtWUKUkx37lLfRq7B5sqjZVKdpBZe4tL0jg6cX5Djd3Uhk1inR9UXVNw4/y4
QGfzYqOn8+Cq7QSoBysHOeXSiPztW2cL09ktPgSlfTQyN6ELNGuiUOYnaTWYZpp/
QbRcZ/eHBulVQLlk5M6RVs9BLI9X08RAl7EcwumiRfWas6kCQQDvqC0dxl2wIjwN
czILcoWLig2c2u71Nev9DrWjWHU8eHDuzCJWvOUAHIrkexddWEK2VHd+F13GBCOQ
ZCM4prBjAkEAz+ENahsEjBE4+7H1HdIaw0+goe/45d6A2ewO/lYH6dDZTAzTW9z9
kzV8uz+Mmo5163/JtvwYQcKF39DJGGtqZQJBAKa18XR16fQ9TFL64EQwTQ+tYBzN
+04eTWQCmH3haeQ/0Cd9XyHBUveJ42Be8/jeDcIx7dGLxZKajHbEAfBFnAsCQGq1
AnbJ4Z6opJCGu+UP2c8SC8m0bhZJDelPRC8IKE28eB6SotgP61ZqaVmQ+HLJ1/wH
/5pfc3AmEyRdfyx6zwUCQCAH4SLJv/kprRz1a1gx8FR5tj4NeHEFFNEgq1gmiwmH
2STT5qZWzQFz8NRe+/otNOHBR2Xk4e8IS+ehIJ3TvyE=
-----END RSA PRIVATE KEY-----

编辑 → 首选项 → TLS里导入RSA密钥

成功导入后再导出http流,其中只有一个文件,打开就可以看到flag

flag:DDCTF{0ca2d8642f90e10efd9092cd6a2831c0}

注:比较坑的是buu上附件与flag不符,经过一番尝试最终找到了buu上的flag

flag{a84f90a4d00bcc4cca874a83ef4f84a6}

音频相关

[GUET-CTF2019] soul sipse

  • 考点:频谱图信息涂抹 & Unicode编码

下载附件得到音频文件,用audacity打开查看频谱图,可以看到一句话:这两个数的和是多少?

用steghide可以从中提取出txt(没有密码),其中给了一个网址:https://share.weiyun.com/5wVTIN3

下载得到一张图片,修改文件头为89504E47即可打开:

观察\u可知其为Unicode编码,解码可得两个数字:40701234

根据频谱图中得到的提示将两个数字做和即为flag:flag{5304}

[INSHack2018] (not) so deep

  • 考点:Deepsound解密 & john爆破

下载附件得到一个WAV文件,拖进audacity查看频谱图,就可以得到前一半flag:

如果查看频谱图时,出现以下情况:

只能看到下面一部分的字符,说明可查看的最高频率不够,可通过频谱图设置将最高频率调大

得到后半部分的flag需要用到新的工具:Deepsound

用这个软件打开音频时,提示需要Password,所以我们需要先破解他的密码

通过看Root.师傅的wp学到了破解方法:需要用到John的破解脚本,附上操作方法:

这样就得到了所需要的的密码:azerty

再用Deepsound打开就可以得到后半部分的flag:0_1s_4lwayS_Th3_S4me}

flag{Aud1o_st3G4n0_1s_4lwayS_Th3_S4me}

[ACTF新生赛2020] music

  • 考点:异或修复m4a文件

下载附件解压得到一个m4a的音频文件,尝试播放却报错,用010editor查看发现文件头不太对

正常的m4a文件头:00 00 00 20 66 74 79 70 4D 34 41 20 00 00 00 00

而用010editor查看得到的却是

很显然全都不对,00全都变成了A1,其他的也都对不上,由此可以考虑将所有十六进制数值与A1异或

用010editor就能实现

异或完得到

将文件保存后再打开即可听到flag:flag{abcdfghijk}

压缩包

zip

  • 考点:脚本爆破68个压缩包的crc

下载附件解压可以得到68个加密过的压缩包,查看压缩包中的内容发现都是只有4字节的大小,于是我们可以通过直接爆破这四字节的内容所对应的crc值达到直接得到压缩包中内容的目的,附上脚本:

# python3

import zipfile
import string
import binascii

def CrackCrc(crc):
 for i in dic:
     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)
     print('\r'+"进度:{:%}".format(float((i+1)/68)),end='')

dic = string.ascii_letters + string.digits + '+/='
f = open('out.txt','w')
print("\nCRC32碰撞开始")
CrackZip()
print("CRC32碰撞完成")
f.close()

跑完脚本打开 out.txt 发现里面是base64加密过的字符,用脚本解密后写入文件:

f = open('out.txt','r').read()
out = open('flag.zip','w')
f = f.decode('base64')
out.write(f)
out.close()

用winhex打开可以看到文件尾是 C4 3D 7B 00 40 07 00 ,可以判断为rar文件,但是该文件缺少rar的文件头(52 61 72 21 1A 07 00),补上文件头后保存为rar文件并打开,就可以看到flag

flag:flag{nev3r_enc0de_t00_sm4ll_fil3_w1th_zip}

[INSHack2018] 42.tar.xz

  • 考点:脚本循环解压

下载附件得到压缩包,打开压缩包观察可以发现里面的每个压缩包中都有很多压缩包,但是没有密码,于是可以写脚本解压,附上bash脚本:

while [ "`find . -type f -name '*.tar.xz' | wc -l`" -gt 0 ]; do 
    find -type f -name "*.tar.xz" -exec tar xf '{}' \; 
    -exec rm -- '{}' \;; 
done;

当脚本运行开始报错时停止,得到名为flag的文件,strings命令查看一下字符串即可得到flag

flag{04ebb0d6a87f9771f2eea4dce5b91a85e7623c13301a8007914085a91b3ca6d9}

其他

[SWPU2019] Network

  • 考点:63 255 127 191

下载后发现里面只有一个txt文档,打开后发现里面只有四个数字:63 255 127 191

将这四个数字转成8位二进制后发现,只有最高两位二进制不同,我们尝试写一个脚本将其最高两位提取出来,并且4个一组转换为ASCII。发现写出来的16进制数开头是 50 4B ,也就应该是 zip文件 了,脚本如下:

fp = open('t.txt','r')
a = fp.readlines()
p = []
for i in a:
    p.append(int(i))

s = ''
for i in p:
    if i == 63:
        a = '00'
    elif i == 127:
        a = '01'
    elif i == 191:
        a = '10'
    elif i == 255:
        a = '11'
    s += a

import binascii

flag = ''
for i in range(0,len(s),8):
    flag += chr(int(s[i:i+8],2))

flag = binascii.unhexlify(flag)
wp = open('ans.zip','wb')
wp.write(flag)
wp.close()

运行脚本后得到一个 ans.zip 的压缩文件,打开后发现内容被加密,扔进 winhex 后发现全局加密和局部加密位不一样,也就是伪加密,搜索 504B0102 将对应的三个 09 改为 00 后打开可得到一大串字符

在线网站解密 base64 即可得到flag:

flag{189ff9e5b743ae95f940a6ccc6dbd9ab}

[SWPU2019] 伟大的侦探

  • 考点:word解乱码 & 跳舞的小人加密

下载后有一个未被加密的txt文件和几张被加密的图片,打开未被加密的txt文件可以看到

将这些被编码过的乱码单独存放在一个doc文件中,用 word 打开会出现可读编码预览,选择第一个即可

得到压缩包解压密码: wllm_is_the_best_team!

解压后得到misc文件夹,内容如下

很明显为 福尔摩斯跳舞的小人 加密,对照密码表解开即可得到flag:flag{iloveholmesandwllm}

[SWPU2019] 我有一只马里奥

  • 考点:NTFS数据流

下载文件后打开为一个exe可执行文件,双击执行后会产生一个1.txt的文件,里面只有两行字:

ntfs
flag.txt

经过百度ntfs后可知(参考网址)该1.txt文件中还隐藏着另外一个文件,我们在1.txt所在文件夹打开命令行执行notepad 1.txt:flag.txt即可得到flag:flag{ddg_is_cute}

[RCTF2019] draw

  • 考点:logo语言编译

比较简单的一道题,但是很新颖

下载附件得到一串字符,浏览器搜索可知为logo语言

cs pu lt 90 fd 500 rt 90 pd fd 100 rt 90 repeat 18[fd 5 rt 10] lt 135 fd 50 lt 135 pu bk 100 pd setcolor pick [ red orange yellow green blue violet ] repeat 18[fd 5 rt 10] rt 90 fd 60 rt 90 bk 30 rt 90 fd 60 pu lt 90 fd 100 pd rt 90 fd 50 bk 50 setcolor pick [ red orange yellow green blue violet ] lt 90 fd 50 rt 90 fd 50 pu fd 50 pd fd 25 bk 50 fd 25 rt 90 fd 50 pu setcolor pick [ red orange yellow green blue violet ] fd 100 rt 90 fd 30 rt 45 pd fd 50 bk 50 rt 90 fd 50 bk 100 fd 50 rt 45 pu fd 50 lt 90 pd fd 50 bk 50 rt 90 setcolor pick [ red orange yellow green blue violet ] fd 50 pu lt 90 fd 100 pd fd 50 rt 90 fd 25 bk 25 lt 90 bk 25 rt 90 fd 25 setcolor pick [ red orange yellow green blue violet ] pu fd 25 lt 90 bk 30 pd rt 90 fd 25 pu fd 25 lt 90 pd fd 50 bk 25 rt 90 fd 25 lt 90 fd 25 bk 50 pu bk 100 lt 90 setcolor pick [ red orange yellow green blue violet ] fd 100 pd rt 90 arc 360 20 pu rt 90 fd 50 pd arc 360 15 pu fd 15 setcolor pick [ red orange yellow green blue violet ] lt 90 pd bk 50 lt 90 fd 25 pu home bk 100 lt 90 fd 100 pd arc 360 20 pu home

在线网站编译:https://www.calormen.com/jslogo/

得到flag:flag{RCTF_HeyLogo}

真的很杂

  • 考点:apk文件反编译

下载附件得到一张图片,用binwalk分离可以得到一个压缩包,用foremost分离也可以得到相同的压缩包,还可以得到很多图片,里面还有安卓的图标,第一次做到这里就没什么头绪了,在参考了Root师傅的wp后才知道这个压缩包是一个 apk文件,将后缀改为apk,用 jadx-gui 打开

即可看到flag:flag{25f991b27fcdc2f7a82a2b34386e81c4}

snake

  • 考点:Serpent加密

下载得到一张图片,名为snake,binwalk分离可以得到一个cipher和一个key

对key中内容进行base64解密,可以得到一句话

What is Nicki Minaj's favorite song that refers to snakes?

根据提示查一下Nicki Minaj这个歌手关于蛇的歌,查到anaconda

而蛇这个单词在英语中还有另一种说法:seprent,这同时也是一种加密算法的名字,在线网址解密

得到flag:flag{who_knew_serpent_cipher_existed}

[UTCTF2020] zero

  • 考点:零宽度字符隐写

下载附件得到一个txt文件,里面是一长段英文,乍一看没有什么特别的地方,但是将这个文件用> vim查看,就会发现其中隐藏了大量的信息

很显然是零宽度字符隐写,在线网站弄一下,在上图中可以看到共有>五种零宽度字符,尝试一下将U+200B这一项去掉,选择其他四种字符进行解密,就可以得到flag(但是我还不是很清楚为什么要将U+200B去掉)

得到flag:flag{whyNOT@sc11_4927aajbqk14}

key不在这里

  • 考点:二维码扫码结果转ASCII

下载附件得到一个二维码,用QR_Research扫一下,可以得到一个网址

进入这个网址是一个必应搜索,没有得到什么有用的信息,观察这个网址,其中含有一个m变量,仔细观察发现可以将m的值分解为ASCII码,从而转换成字符,而且恰好102 108 97 103对应了flag这四个字符,写脚本转换一下:

a = '10210897103375566531005253102975053545155505050521025256555254995410298561015151985150375568'
flag = ''
i = 0
while i < len(a):
   ans = 0
   ans += int(a[i])
   while ans < 32:
       ans = ans*10 + int(a[i+1])
       i += 1
   flag += chr(ans)
   i += 1
   #print ans

print flag

得到flag:flag{5d45fa256372224f48746c6fb8e33b32}

梅花香之苦寒来

  • 考点:gnuplot画图

下载附件得到图片,用010editor查看,在图片尾FFD9后可以发现还有很长的数据,观察可知为十六进制,将其复制出来,十六进制转一下可以得到一些坐标:

(7,7)
(7,8)
(7,9)
(7,10)
(7,11)
(7,12)
(7,13)
(7,14)
(7,15)
(7,16)
(7,17)
(7,18)
(7,19)
(7,20)
...

结合图片属性→详细信息中提到的会画图吗可知需要将这些坐标绘制成一张图片,用gnuplot这个工具即可

先将坐标转化成gnuplot可以识别的形式:

7 7
7 8
7 9
7 10
7 11
7 12
7 13
7 14
7 15
7 16
7 17
7 18
7 19
7 20
...

然后用plot命令画一下就可以得到一张二维码,扫一下即可得到flag

kali一句话安装gnuplot:sudo apt-get install gnuplot

plot命令方法:plot "文件名"

flag:flag{40fc0a979f759c8892f4dc045e28b820}

[SUCTF2018] dead_z3r0

  • 考点:pyc隐写

下载得到一个无后缀的文件,winhex查看可以发现文件开头有一长串字符,后面的是pyc文件,很容易想到pyc隐写,但是我们需要先将开头的字符删去,保留到pyc的文件头,对于此文件来说就是33 0D 0D 0A,保存后用stegosaurus解一下即可得到flag

flag:flag{Z3r0_fin411y_d34d}

[watevrCTF 2019] Unspaellablle

  • 考点:文本差异藏flag

下载附件得到一个txt文件,打开后发现里面是一篇文章,在网上我找到了格式一模一样的原文,将网上的原文复制下来存为txt文件,用beyond compare比较两个文本,可以发现题目所谓文本中藏有很多本不属于这篇文章的内容,将这些字符按照顺序连起来即可得到flag

  • 图中左侧为原文,右侧标红的字符即是多余的字符

flag:flag{icantspeel_tiny.cc/2qtdez}

[INSHack2019] gflag

  • 考点:3D打印gcode命令

下载附件将gflag文件改后缀为txt,可以看到里面的内容

M73 P0 R2
M201 X9000 Y9000 Z500 E10000
M203 X500 Y500 Z12 E120
M204 P2000 R1500 T2000
M205 X10.00 Y10.00 Z0.20 E2.50
...

通过Root师傅的博客学到了,这是3D打印gcode命令,可以在在线网站浏览

要把文件后缀改为gcode,在网站里加载后,调整左侧的选项,就可以看到

把里面的内容复制到左侧的框框里,再稍微调整一下右上角的视角,也可以看到

flag:flag{3d_pr1nt3d_fl49}

[INSHack2017] 10-cl0v3rf13ld-lane-signal

  • 考点:隐藏ogg音频文件

下载附件得到一个unk后缀文件,具体是啥我也不太清楚,直接拖进kali中,发现是一张图片,用binwalk分析可知其中藏有其他图片文件

用foremost可以直接分离,得到另一张图片(png文件),图片内容为morsecode对照表,推测flag和morse电码有关,但是再查看图片以及得到的这张图片,其中都没有什么有关morse电码的信息,转而查看最初的unk文件,将其拖进010editor查看,刚才用foremost分离文件时可以看到两张图片分别为jpgpng,于是搜索文件头尾,发现jpg文件尾后紧连着png文件头

但是png文件尾后还有信息,且开头为Ogg

百度可知ogg为一种音频文件,将从Ogg开始的后面所有信息复制出来另存为一个Ogg文件,播放就可以听到morse电码,也可直接查看波形图,更加明显

长的对应-,短的对应.,得到(下面用空格分隔)

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

在线网站解密一下,得到flag:flag{M0R53_W1LL_N3V3R_4G3!}

粽子的来历

  • 考点:行间距转换01序列

注:本题解法属于偏脑洞方向,不要太刻意追求合理性,但最后的关键考点有值得学习借鉴的地方

下载题目附件,给了4个doc文件,打开发现除了其中的一句话以外都是乱码,用010editor打开发现每个文件的那句话都被大量的FF包围,于是考虑将其也全都改为FF,保存后再打开,即可正常看到doc文件里的内容

仔细观察文档中的内容,可以发现行与行的间距是不一样的,而且只有1.01.5两种间距,于是考虑将其对应转换为01序列,但四个文件中行间距都不一样,所以一一进行尝试,最终在C文件中得到正确答案

根据题意32位小写md5,得到flag:flag{d473ee3def34bd022f8e5233036b3345}

[SCTF2019] 电单车

  • 考点:无线遥控信号

原题的题目描述:

截获了一台电动车的钥匙发出的锁车信号,3分钟之内,我要获得它地址位的全部信息。flag内容二进制表示即可。

根据题目描述,wav文件中收集的是锁车时的无线遥控发出的信号,要获得其地址位的信息

参考文章:https://www.freebuf.com/articles/wireless/191534.html

文章中写了两种不同型号的无线遥控模块发出的信号,地址位分别为8位20位,本题给的信号长度很短,而且仔细观察可以发现最后一部分的信号和中间的相同,结构都为20+4(+1),所以本题地址位为中间的20位,或者由于本题所给的信号长度很短,直接尝试两种不同型号也可得到正确答案

长的为1,短的为0,得到flag:flag{01110100101010100110}

[INSHack2018] Spreadshit

  • excel利用空格隐藏信息

下载附件得到一个描述和一个表格,描述里写道

This spreadsheet doesn't contain anything interesting... Or does it ?

言外之意为表格里隐藏了一些有趣的东西

打开表格,第一眼看上去发现里面什么都没有,然后我就随便翻了翻,发现有一些格子中有空格,我就查找替换了下,将空格替换成了1,这时就已经能大概看到flag的样子了,但是还不够清晰,所以我就又用红色将含有1的格子填充了下,然后将整体缩小,最终效果如下(有些大小写不明显,多试几次就好)

得到flag:flag{3cf6463910edffb0}

[GWCTF2019] math(pwntools交互)

  • pwntools交互

要进行150次交互解题,都是加减乘除,写脚本交互一下

from pwn import *

p = remote('node3.buuoj.cn','25492')
for i in range(150):
    x = p.recvuntil('problem: ')
    print x
    a = int(p.recvuntil('*')[:-1])
    b = int(p.recvuntil('-')[:-1])
    c = int(p.recvuntil('+')[:-1])
    d = int(p.recvuntil('=')[:-1])
    p.sendline(str(a*b-c+d))

p.interactive()

都算完后ls -a即可看到flagcat查看一下即可

一路到底(数字转hex得到zip)

  • 考点:数字转hex得到zip

下载得到一堆txt文档,从start.txt开始,每个文档都指向了下一个文档,写脚本遍历一下,跑到最后得到最后一个文档中的内容

41889 : End !

在请教Neve3no师傅后,得知这道题的关键是在每个文档中最前面的数字

比如在第一个文档中

20555 : The next is a8242a234560a0d3cf121864ee34d7fb.txt

20555转成十六进制后得到0x504b,很明显的zip文件头标志,所以想到按照文件中的顺序将每个文件中的数字转换成十六进制后连起来,得到zip

f = open('./files/start.txt').read().strip()
next = f[f.find('is ')+3:]
out = ''
out += hex(int(f[:f.find(':')].strip()))[2:]
while 1:
    n = './files/' + next
    fi = open(n).read().strip()
    #print fi
    out += hex(int(fi[:fi.find(':')].strip()))[2:].zfill(4)
    next = fi[fi.find('is ')+3:]

zip = open('1.zip','w')
zip.write(out.decode('hex'))
zip.close()

得到一个加密压缩包,可以看到备注

年轻人,能走到这一步不容易啊!不要灰心,密码十分钟就可以破解哦,加油!

尝试爆破,不得不说这个爆破太坑了,试了半天最后得到六位密码:tgb678

得到图片发现打不开,010editor看一下发现不是png文件,是jpg文件,修改文件头为FF D8 FF E0后打开即可看到flag

[*CTF2019] babyflash(flash图像音频分离)

  • 考点:flash图像音频分离

附件中给了一个.swf文件,搜一下这种文件格式,可以得知是一种flash软件生成的文件,可以用jpexs-decompiler这个软件来进行反编译

可以从中导出所有图片及音频,导出图片后发现都是黑白两种,且共有441张,即21x21,很容易想到最小规格的二维码,写脚本先识别出01序列

from PIL import Image

out = ''
for i in range(900):
    try:
        f = Image.open(str(i) + '.png')
        pim = f.load()
        if pim[0,0][0] == 0: # 判断为黑色(0,0,0)
            out += '1'
        else: # 判断为白色(255,255,255)
            out += '0' 
    except:
        continue

print out

根据得到的01序列,黑色对应1,白色对应0,画出二维码,并读取内容

from PIL import Image
from pyzbar import pyzbar

data = '111111100110001111111100000100111001000001101110101011001011101101110100100101011101101110100101101011101100000100110001000001111111101010101111111000000001010100000000111011111011111000100110110011011101111011101101111001101111011010010001100000000011111010100000100011000000000001011100110011111111101011100110101100000101101000100010101110101011011000001101110100101101110000101110101101110110001100000101011100010010111111101101100001011'
im = Image.new('RGB', (210, 210))
for x in range(21):
    for y in range(21):
        if data[x*21+y] == '1':
            for xx in range(x*10, x*10+10):
                for yy in range(y*10, x*10+10):
                    im.putpixel([xx, yy], (0,0,0))
        else:
            for xx in range(x*10, x*10+10):
                for yy in range(y*10, y*10+10):
                    im.putpixel([xx, yy], (255,255,255))

#im.show()
outlist = pyzbar.decode(im)
for out in outlist:
    barcodedata = out.data
    print barcodedata

成功得到前半部分flag:*ctf{half_flag_&

再看从flash文件中分离出来的MP3文件,用Audacity打开查看频谱图

将两部分拼接在一起,得到完整flag:*ctf{half_flag_&&_the_rest}

注:很坑的是buu上的flag要修改一下:flag{halfflag&&_the_rest}

全部评论

info 评论功能已经关闭了呐!