buuctf-Misc91-120题wp

九十一、[SWPU2019]Network

10MB的txt貌似是rgb

1016*746

这个时候处理数字的时候发现只有四个数63,127,191,255,应该不是rgb

重新看txt文件,出现了四个数,这四个数字转成8位二进制后,只有最高两位二进制不同,我们尝试写一个脚本将其最高两位提取出来,并且4个一组转换位ASCII

这里贴一个脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
f = open("attachment.txt", "r")
s = ''
tmp = ''
while 1:
num = f.readline()
if not num:
break
if num.rstrip() == '63':
tmp = '00'
elif num.rstrip() == '127':
tmp = '01'
elif num.rstrip() == '191':
tmp = '10'
elif num.rstrip() == '255':
tmp = '11'
s += tmp

print(s)

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

print(number)

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

import base64

f3 = open('flag.txt', 'r')
strs = f3.readline()
while 1:
strs = base64.b64decode(strs)
print(strs)

伪加密

直接用7z压缩包打开

base64解密

需要很多次的解密,用脚本

1
2
3
4
5
6
7
8
9
10
11
12
# -*- encoding: utf-8 -*-
import base64
def base64decode():
f = open('flag.txt', 'rb')
flag = f.read()
while b'flag' not in flag:
flag = base64.b64decode(flag)
print(flag)
if __name__ == '__main__':
print("Start...")
base64decode()
print('Done!')

flag{189ff9e5b743ae95f940a6ccc6dbd9ab}

九十二、[SUCTF2018]single dog

一张图片

foremost出一个zip

这是js颜文字加密,直接用浏览器控制台就可以解密了

但是这个不是flag

重新找在线解密https://www.qtool.net/decode

这个颜文字叫aaencode解密

九十三、[MRCTF2020]千层套路

之前打过这场比赛

先是套娃压缩包,压缩密码是文件名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## -*- coding: utf-8 -*-
# 引入zipfile模块
import zipfile
with zipfile.ZipFile('0114.zip','r') as zzz:
name = zzz.namelist()[0]
password = name[:4]
password=password.encode(encoding='utf-8')
print(name)
print(password)
with zipfile.ZipFile('0114.zip','r') as zzz:
zzz.extractall(pwd=b'0114')
while(1):
with zipfile.ZipFile(name, 'r') as zzz:
zzz.extractall(pwd=password)
with zipfile.ZipFile(name, 'r') as zzz:
name = zzz.namelist()[0]
password = name[:4]
password = password.encode(encoding='utf-8')

先把第一个文件名获取了,因为pwd后面是b’所以要把密码变成utf-8的编码方式

报错的时候循环结束

解压600次

打开是rgb值

我把括号去掉了

方便代码运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#-*- coding:utf-8 -*-
from PIL import Image
import re

x = 200 #x坐标 通过对txt里的行数进行整数分解
y = 200 #y坐标 x*y = 行数

im = Image.new("RGB",(x,y))#创建图片
file = open('qr.txt') #打开rbg值文件

#通过一个个rgb点生成图片
for i in range(0,x):
for j in range(0,y):
line = file.readline()# 获取一行
rgb = line.split(",")# 分离rgb
im.putpixel((i,j),(int(rgb[0]),int(rgb[1]),int(rgb[2])))# rgb转化为像素
im.show()

先是要算一下长宽,不然图片畸形,

算200*200吧

把代码里面的x,y改成200,200

九十四、[GUET-CTF2019]虚假的压缩包

虚假的压缩包是伪加密

里面是一个txt

这是一个RSA

先分解n求出p,q分别为3,11

已知p,q,e求d

已知c,d,n求m

得到m=5

挂一个整合的脚本

1
2
3
4
5
6
7
8
9
10
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

脚本跑一下(python2)

1
2
3
4
5
6
7
8
9
10
f1 = open('./cipher','r')
xor_data = f1.read()
f1.close()
dec_data = ""
for i in xor_data:
tmp = int(i,16) ^ 5
dec_data += hex(tmp)[2:]
f2 = open('./data.doc','wb')
f2.write(dec_data.decode('hex'))
f2.close()

把那个文件名改成cipher

得到一个doc文件

结尾感觉有东西

九十五、[WUSTCTF2020]爬

应该是个pdf

算是Pdf隐写

就分离出一张图片

这应该方向错了,正确的方向就是提示里的flag被图片挡住了,那目的就是把图片移开

电脑上没什么软件,直接用手机的wps了,而且wps有会员

点击编辑之后,应该就自动把pdf转成word了,然后下面点 图片编辑
就可以选中图片把图片移开,看到图片下面藏着一个图片

一串编码还是十六进制的,考虑十六进制转字符串

http://www.bejson.com/convert/ox2str/

flag{th1s_1s_@_pdf_and_y0u_can_use_phot0sh0p}

九十六、[WUSTCTF2020]girlfriend

然后有一段音频

是拨号音

http://dialabc.com/sound/detect/

用这个网站

999*666*88*2*777*33*6*99*4*444*777*555*333*777

这个在线的识别好像不准,找到一个本地的识别软件dtmf2num

999*666*88*2*777*33*6*999*4*4444*777*555*333*777*444*33*66*3*7777

这个在ctf-wiki有讲过是手机键盘密码

http://dyf.ink/crypto/classical/others/#_24

picture

999就是指按三下数字9得到的字母也就是y,以此类推,数字对应手机的每个键位,几个数字代表按几下

999 —> y

666 —> o

88 —> u

2 —> a

777 —> r

33 —> e

6 —> m

999 —> y

4 —> g

4444 —> i

777 —> r

555 —> l

333 —> f

777 —> r

444 —> i

33 —> e

66 —> n

3 —> d

7777 —> s

youaremygirlfriends

九十七、[ACTF新生赛2020]swp

压缩包里面有一个流量包,看了http导出,有很多的文件,我直接用foremost提取出来了,发现有个压缩包

打开压缩包先会提示压缩包损坏,但是点确定之后又会显示上面的图的样子

用7z解压掉,提示是这样的

先不管

里面的flag.swp很奇怪,在notepad++打开,找了半天还真找到flag了

flag{c5558bcf-26da-4f8b-b181-b61f3850b9e5}

九十八、[MRCTF2020]CyberPunk

一个exe文件

改时间到2020.9.17就会出flag了

最方便的就是改系统时间了

九十九、[GKCTF2020]Harley Quinn

看hint说电话音,听一下音频,在最后听到拨号音

用这个软件把后面那段鼠标选中,复制到新建的文件里面保存

参考九十六题的方法

两个方式出来的结果都不准确,都是错误的,主要是次数经常检测出错,我们重新听一遍比一比就知道了

#222833344477773338866#

这也是手机键盘号,和九十六题也一样

#ctfisfun#

然后再看第二个hint

FreeFileCamouflage这是一个软件

FreeFileCamouflage 是一款将重要文档以 AES 加密算法存放到 JPG
格式的图片中,于是开始下载使用如下, passwd 就是之前得到的 ctfisfun

这里只能打开jpg后缀的图片,这个图是jpeg的,所以把图片后缀改成jpg

点一下左边的De-Camouflage!右边会弹出绿色的字

然后在桌面就可以看到了

导出一个flag.txt文件

flag{Pudd1n!!_y0u_F1nd_m3!}

一百、[RCTF2019]draw

这是一种题型吧,用一个叫logo解释器的东西进行解析

https://www.calormen.com/jslogo/

这是使用工具

https://personal.utdallas.edu/~veerasam/logo/

这个应该是对这张方法的解释

flag{RCTF_HeyLogo}

一百零一、[安洵杯 2019]easy misc

把这个hint算一下

FLAG IN 7 + NNULLULL, 别忘了后面的逗号,是个巨坑

这个应该是压缩包密码,并且这个很可能是掩码爆破

秒出结果

在read文件夹里面有很多的txt

里面都是各种乱七八糟的好像英语文章一样的,怀疑是字频隐写

但是肯定不是这么多txt都要用,可能是其中一篇

下面有个hint说取前16个字符应该意思就是取前16个高频字符组成flag

那就去看看那张图片有什么信息

binwalk发现隐藏png,foremost提取

两张内容一样,大学不一样的图片

一般这张情况考虑盲水印

盲水印有两个工具来解

一个是github上的项目

https://github.com/chishaxie/BlindWaterMark

里面有两个py文件分别代表python2或3版本的

python2兼容性最好,我用ubuntu运行这个脚本

1.png和2.png就是题目的两张图,然后导出flag.png这张图

需要注意的是这个脚本需要安装一个库

1
pip install opencv-python

水印是 in 11.txt

还有一种工具是这个软件

https://www.anxz.com/down/10929.html

一般如果这个python项目解不出来可以尝试这个软件

目前还不知道为什么不能添加两张图片,这个软件的使用先放着

然后我们用11.txt进行字频统计

之前用过这个代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+- ={}[]"
f = open("flag.txt", "r")
data = f.read()
result = {d: 0 for d in alphabet}


def sort_by_value(d):
items = d.items()
backitems = [[v[1], v[0]] for v in items]
backitems.sort(reverse=True)
return [backitems[i][1] for i in range(0, len(backitems))]


for d in data:
for alpha in alphabet:
if d == alpha:
result[alpha] = result[alpha] + 1

print(sort_by_value(result))

结果是前十六位即etaonrhsidluygw

然后看最开始的decode.txt对应一下

QW8obWdIWT9pMkFSQWtRQjVfXiE/WSFTajBtcw=

直接base64解码

Ao(mgHY?i2ARAkQB5_^!?Y!Sj0ms

这还不是flag还要base85解码

flag{have_a_good_day1}

一百零二、[SUCTF2018]followme

一个流量包,有十几兆,先想到binwalk

这么一张gif很奇怪

看了半天分析不出来,可能想复杂了,直接进流量包搜索suctf和flag

在分组详情里找,直接找到了flag

SUCTF{password_is_not_weak}

一百零三、派大星的烦恼

派大星最近很苦恼,因为它的屁股上出现了一道疤痕!我们拍下了它屁股一张16位位图,0x22,0x44代表伤疤两种细胞,0xf0则是派大星的赘肉。还原伤疤,知道是谁打的派大星!(答案为32位的一串字符串)
注意:得到的 flag 请包上 flag{} 提交

这题给了一个压缩包里面有一张图片,这个压缩率很高,说明冗余数据很多

先是想到把这个用01表示

然后对上题目的说明,但是不行

于是用winhex打开看看

看上去好像都是F0,但是因为看到图片上有一条东西,所以这个数据肯定也有那么一块区域是不一样的

找到了,题目刚好说22和44是伤疤,和这个对上了

我们将 “ 替换为0, D替换为1

0110110000101100000011000110110010011100101011000000110010000110101011000010110010001100000111000010110001000110001001101010110001100110101001100110110001000110011011001010011010101100010001100010110011000110101001100010110011001100000111001100110001001100

像这张二进制的东西有好几种思路处理,一种是把1去掉用0来摆图案,摆出flag

但是根据题目描述这样肯定摆不出来的

另一种就是用01来用python画二维码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from PIL import Image

x = 16
y = 16

im = Image.new('RGB', (x, y))
white = (255, 255, 255)
black = (0, 0, 0)

with open('file.txt') as f:
for i in range(x):
ff = f.readline()
for j in range(y):
if ff[j] == '1':
im.putpixel((i, j), black)
else:
im.putpixel((i, j), white)
im.save("1.jpg")

这个脚本好像是错的,生成的图片有问题,本来应该生成下图这样的,代码先放着

并不是二维码

然后就是二进制转字符串了

但这里有问题,它并不能直接转换为ascii,可以看出第三位 00001100
就已经不能转换为可显示字符

这时候可以变换一下

从头开始将每八位二进制数倒序,得到字符串,成功

贴一个别人的脚本

1
2
3
4
5
6
7
8
9
10
def bin_to_str(s):
return ''.join([chr(i) for i in [int(b, 2) for b in s.split(' ')]])
a = "01101100 00101100 00001100 01101100 10011100 10101100 00001100 10000110 10101100 00101100 10001100 00011100 00101100 01000110 00100110 10101100 01100110 10100110 01101100 01000110 01101100 10100110 10101100 01000110 00101100 11000110 10100110 00101100 11001100 00011100 11001100 01001100"
a = a.split(' ')
flag=''
for i in a:
test=i[::-1]
flag+=bin_to_str(test)

print flag

flag{6406950a54184bd5fe6b6e5b4ce43832}

一百零四、[MRCTF2020]不眠之夜

拼图题,拼完就有flag

之前这场比赛的时候我是用ps拼的

flag{Why_4re_U_5o_ShuL1an??}

这里尝试一下用软件拼

imagemagick先用这个软件把多张图片拼到一张图片里面去

http://www.imagemagick.com.cn/index.html

中文网

http://www.imagemagick.org/script/index.php

英文网

http://railscasts.com/episodes/374-image-manipulation

这个是说明吧

不需要管官网上的安装方法(在windows上安装太麻烦了,还不好用,我们直接在ubuntu里面装)

1
sudo apt-get install gimp graphicsmagick-libmagick-dev-compat libmagickwand-dev

一条命令即可

测试到底安装了没有可以使用这个命令试试能不能把照片变黑白

1
convert cat.jpg -quantize GRAY -colors 256 grey.jpg

cat.jpg是原始文件,grey.jpg是变黑白之后的文件名

成功之后我们试着拼图

先查看文件夹里面一共有121张图片,就是11*11

然后cd到这个文件夹

1
montage \*.jpg -tile 11x11 -geometry +0+0 flag.jpg

把当前目录下的所有jpg图片拼到一个flag.jpg的图片里面去

应该是成功了的

然后用gaps这个项目进行拼图

https://github.com/nemanja-m/gaps

  1. 下载打开到当前目录

    1
    2
    git clone <https://github.com/nemanja-m/gaps.git>
    cd gaps
  2. 用linux系统安装

    1
    2
    pip install -r requirements.txt
    sudo apt-get install python-tk
  3. 还要用linux

    1
    pip install -e 
  4. 所有都安装成功了

  5. 文件夹里面有实例图片

    1
    create_puzzle images/pillars.jpg --size=48 --destination=puzzle.jpg

    代表原图分割成功

  6. 拼图

    1
    gaps --image=puzzle.jpg --generations=20 --population=600
  7. 指定大小的拼图

    1
    gaps --image=puzzle.jpg --generations=20 --population=600 --size=48

    不指定的话,很多时候不能完成

    这个size就是小正方形的边长,如果是长方形就取长宽的最大公因数

    我们输入

    1
    gaps --image=flag.jpg --generations=20 --population=600

    有一点误差,但是flag已经很清楚了

一百零五、粽子的来历

曹操的私生子曹小明因为爸爸活着的时候得罪太多人,怕死后被抄家,所以把财富保存在一个谁也不知道的地方。曹小明比较喜欢屈原,于是把地点藏在他的诗中。三千年后,小明破译了这个密码,然而却因为担心世界因此掀起战争又亲手封印了这个财富并仿造当年曹小明设下四个可疑文件,找到小明喜欢的DBAPP标记,重现战国辉煌。(答案为正确值(不包括数字之间的空格)的小写32位md5值)
注意:得到的 flag 请包上 flag{} 提交

word文件损坏,需要修复

这里本来都是FF的但是中间突然出现了I come from
alibaba这个应该是被人加上去的。把这些都改成FF试试

成功打开word,把其他几个doc也都改掉

四个word内容都一样,但是发现行距不一样

100111100010

101010010011

100100100001

根据题目我们把这四个doc提取出的二进制分别md5加密尝试flag

发现第三个doc文档提取出来的二进制md5加密后刚好是flag

flag{d473ee3def34bd022f8e5233036b3345}

一百零六、[SCTF2019]电单车

一个wav音频,10MB但是音频时常只有1秒钟

binwalk扫不出东西,重新观察音频本身

好像可以用01来表示

0011101001010101001100010

观察发现上面的这个重复了一次,然后第一个0在最前面

这里查了一下原题

说的是地址位的全部信息

查到信号是由同步引导码,地址位和数据位构成

仔细查看波形图得到如下

所以去掉前面的同步码0和后面的数据位0010得到全部20bit地址位如下:

01110100101010100110

flag{01110100101010100110}

一百零七、[XMAN2018排位赛]通行证

像是位移密码

凯撒密码解码完全不对

查了一下比赛的hint:

xman最强王者开始了,拿到通行证,开始你的王者之路。

XMan通行证flag格式:xman{.*}

hint:这是个签到题;

hint:base64解码

进行栅栏密码加密

使用凯撒密码进行解密

先要用栅栏密码加密再用凯撒解密

flag{oyay_now_you_get_it}

一百零八、[*CTF2019]otaku

一个压缩包,需要密码,怀疑伪加密

用7z直接提取出来了

这是flag.zip

给了注释是这个压缩包的压缩标准,那就很明显了,这个压缩包是明文攻击

我们需要从word里面提取出一段文件命名位last
words.txt然后来攻击这个压缩包拿到解压密码

这是word的内容,看到中间有划线的部分,我们提取出来

发现无法复制,之前做个一个音符的题目,那串音符也复制不出来,也是有下划线的,这里需要设置一下(选中文字后)

直接复制过去发现有433字节,但是压缩包里面的txt只有432字节

用python写入发现刚好432字节,不知道什么原因

然后按照指定版本的winrar进行压缩

因为我电脑里面已经有其他版本的winrar了所以在虚拟机的win10里面安装了题目指定版本的winrar并进行了压缩

开始明文攻击

破解了几分钟手动中止了,虽然显示未找到密钥,但是它会弹出另存为,然后保存到桌面就会发现压缩包是能解压的了

得到一个png图片

直接用zsteg可以直接得到flag(lsb隐写)

flag{vI0l3t_Ev3rg@RdeN}

一百零九、voip

一个流量包

VoIP——基于IP的语音传输(英语:Voice over Internet
Protocol,缩写为VoIP)是一种语音通话技术,经由网际协议(IP)来达成语音通话与多媒体会议,也就是经由互联网来进行通信。其他非正式的名称有IP电话(IP
telephony)、互联网电话(Internet telephony)、宽带电话(broadband
telephony)以及宽带电话服务(broadband phone service)。

点击下面的”播放流”

仔细听

Hi,this is your service.Please press one to listen flag.The flag is S E C C O N,hold on,please.9 0 0 1 I V R close race only capital letter for you.NO,thanks.

SECCON{9001IVR}

一百一十、[MRCTF2020]Unravel!!

之前写过,拿之前的wp

得到一张图片,一个音频,一个压缩包

我发现图片里面有一个隐藏文件,于是改后缀zip,解压出来是

Tokyo是东京,aes是一种密码

我都查了,但是我却联系不起来

音频的文件名是

我就去winhex看了,发现异常

我以为是解压密码,但是解不开,没想到是aes的加密码,aes需要密匙的,就是Tokyo

压缩密码解压压缩包,获得一段音频

用SilentEye

MRCTF{Th1s_is_the_3nd1n9}

一百一十一、真的很杂

杂项题目经常混杂着奇奇怪怪的东西。。。不要想歪了!专心做题=
=!最后获得的东西需要暴力得到哦(提示:前一个字母,后一个数字) 注意:得到的
flag 请包上 flag{} 提交

给了一张图片

基本上图片隐写了

foremost出很多文件

重点应该是这个压缩包了

好像是个安卓逆向

直接改后缀为apk

成功反编译,找flag

flag{25f991b27fcdc2f7a82a2b34386e81c4}

题目描述说要暴力破解,但是我这个得到的就是真的flag了,可能非预期吧

一百一十二、hashcat

winhex看到应该是doc文档

需要密码

使用软件Accent OFFICE Password Recovery v5.1 CracKed By Hmily[LCG][LSG]暴力破解

下面的选项第二个就是暴力破解

破解成功密码为9919

word打不开

改pptx成功打开

第七页这里有个下划线

把字体选中改成黑色

flag{okYOUWIN}

一百一十三、[BSidesSF2019]zippy

随便点了点,发现这里有个flag.txt

右键追踪tcp流,看到时一个flag.zip里面包含着flag.txt

用binwalk分离

发现foremost不能导出,就用binwalk -e进行导出

导出zip发现需要密码,要么暴力要么伪加密

都不行,那就去流量包里面找密码

密码应该就在这里

试了一下发现是这个supercomplexpassword

一百一十四、[ACTF新生赛2020]明文攻击

两个文件

题目已经很明确了是明文攻击,大概率就是从res.zip里面找到secret.txt

在winhex打开图片里面看到flag.txt

用binwalk无法提取zip

尝试手动提取

发现压缩包文件头被篡改了

随便新建一个txt文件压缩为zip

把前面的部分复制出来,拼接

这题因为提供的就是zip压缩包了,并不是flag.txt文件让我们自己压缩,所以两个压缩包的加密方式肯定是相同的

这里发现压缩包修复错了

明文攻击直接报错了

应该是复制这些,然后在前面加上504b就行了,因为后面有0304

明文攻击还是报错

然后发现可能是文件大小有问题,修复文件头的zip在winhex操作的时候下面有很多的000

应该把这些删掉,如果不知道文件尾是在哪个零,我们直接用winrar的压缩包修复功能就会自动把没用的数据删除掉

然后就可以明文攻击了

然后稍微等几分钟手动暂停

这次花了很长时间才能手动暂停,出现成功恢复弹窗。还好每次停止重新开始都会继续上次的进度

一百一十五、[MRCTF2020]Hello_ misc

这题写过吧

我记得buuctf里面刷到过,但是怎么也找不到了,但是dasctf七月赛遇到过,当时因为最近做过类似的题目所以马上知道该怎么写了,但是当时做的题目应该都是在buuctf上面的

只选一个red

给了一个zip的解压密码,并不是那个rar的解压密码

binwalk 原来的Png在里面看到一个zip

用binwalk -e提出来

这个在buuctf里面写过,第九十一题

跑一下脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
f = open("out.txt", "r")
s = ''
tmp = ''
while 1:
num = f.readline()
if not num:
break
if num.rstrip() == '63':
tmp = '00'
elif num.rstrip() == '127':
tmp = '01'
elif num.rstrip() == '191':
tmp = '10'
elif num.rstrip() == '255':
tmp = '11'
s += tmp

print(s)

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

print(number)

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

import base64

f3 = open('flag.txt', 'r')
strs = f3.readline()
while 1:
strs = base64.b64decode(strs)
print(strs)

rar-passwd:0ac1fe6b77be5dbe

解压题目给的rar

这是个doc文档

一看下面就有内容

base64解密

110110111111110011110111111111111111111111111111101110000001111111111001101110110110001101011110111111111111111111111111111111101111111111111110110011110000101110111011110111111100011111111111001001101110000011111000011111111110110100001111011110111111011101111111110110110101111111100110111111111111110110101111111011110111101011101111111110110110101101111100110111111111111110110100001100000110000001100011100000110110110101110000001111000011111111

把1去掉

He1Lo_mi5c~

一百一十六、[WUSTCTF2020]spaceclub

给了一个txt,打开什么都看不到,用sublime text打开,全选

短的表示0长的表示1

011101110110001101110100011001100011001000110000001100100011000001111011011010000011001101110010011001010101111100110001011100110101111101111001001100000111010101110010010111110110011001101100010000000110011101011111011100110011000101111000010111110111001100110001011110000101111101110011001100010111100001111101

二进制转字符串http://www.txttool.com/wenben_binarystr.asp

wctf2020{h3re_1s_y0ur_fl@g_s1x_s1x_s1x}

一百一十七、[ACTF新生赛2020]music

有个.m4a的音频文件

查了一下发现正常的.m4a文件的文件头是这个:00 00 00 20 66 74 79 70 4D 34 41 20 00
00 00 00

发现00变成了A1,但是奇怪的是其他也变了,不知道是什么操作

再看一下尾部

很多的A1,这些地方应该本来是00的

看了别人的WP才知道需要异或一下

说本来应该是00的,所以需要异或一下

再看看原来的

说明异或把所有内容都异或了

然后把后缀改为mp4就可以打开了

因为mp4的文件头是这个

对应上了

然后听mp4就知道了flag{abcdfghijk}

一百一十八、[湖南省赛2019]Findme

这题好像见过

每张图片应该可以得到一段flag五个拼起来就是一个完整的flag

1.png用lsb隐写查不出来,对比其他图片,应该是宽高问题

用这个脚本可以直接爆破宽高并且修改宽高,另存为一张新的图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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

这样一张图片,看顶部应该是和其他四张一样的不倒翁,但是下面显示不出来

查了一下才知道这是缺少IDAT标识

我们需要用010editor

用010editor打开会提示这个

让我们安装png的模板,我们选择安装

然后我们就会看到下面的png模板了

发现这两个地方缺少IDAT标识

在下面的红线写上IDAT

写的话要在上面的数据区写

查看别的IDAT发现十六进制是

把那两个缺少IDAT标识的十六进制位改成这个就行了

49 44 41 54

两个地方都修改完毕之后保存

这样就正常了

ZmxhZ3s0X3

然后看第二个图片

用winhex打开发现后面有很多的.txt文件

查一下png尾

把后面复制出来,应该是一个7z压缩包

保存后打不开

怀疑这些7z应该要替换成PK因为这些7z出现的地方和PK很像,说不定这是个zip压缩包

成功打开

仔细找,发现一个不一样的

1RVcmVfc

接下来看第三张图片

在kali里面打开会报错

用TweakPNG打开看看

一共报了7个crc错误

用010editor打开看看

输出这里报错,说crc的chunk[0]-[6]都有问题

这里有问题,chunk[0]-chunk[6]的每一个数据块的crc值都是可打印的Ascii字符

我们十六进制转ascii试试

1
2
3
a = [0x33,0x52,0x6C,0x5A,0x33,0x30,0x3D]
for i in a:
print(chr(i),end="")

输出为3RlZ30=

我们再看第四个png

在kali里面输入strings 4.png搜索字符串

看到

cExlX1BsY=

第五张也是这样

都是出现在结尾,所以很好找

Yzcllfc0lN

其实第四张常规的解法是在linux里面用exiftool命令

这里发现和上面找到的少了一个=号,试过发现不需要等于号,所以一般情况下还是不要使用strings命令,还是常规解法比较保险

第五张的常规解法是用winhex打开

在结尾看到

我们把五段flag拼接起来

ZmxhZ3s0X3 1RVcmVfc 3RlZ30= cExlX1BsY Yzcllfc0lN

顺序好像有问题

需要重新排列一下(15423)

ZmxhZ3s0X3Yzcllfc0lNcExlX1BsY1RVcmVfc3RlZ30=

flag{4_v3rY_sIMpLe_PlcTUre_steg}

一百一十九、[UTCTF2020]docx

也不知道干什么,就真给了一个docx文档

binwalk之后

在里面找到了flag

flag{unz1p_3v3ryth1ng}

一百二十、[GWCTF2019]huyao

得到两张图,要么双图,要么盲水印

这题是盲水印,但是有坑,用github上面的那个脚本或者是那个盲水印软件都解不了,需要用自己的py脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# coding=utf-8
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()

需要注意的是这个脚本只能在python2上面运行,所以我们直接放到ubuntu上面就好了

下面是运行命令

1
python decode.py --original huyao.png --image stillhuyao.png --result res.png

(把上面的脚本保存为decode.py,然后huyao.png和stillhuyao.png是题目给的两张图,res.png是输出图片,并且发现两张图的顺序反一下,结果是不一样的)

这就是flag了

flag{BWM_1s_c00l}


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!