BUU NewStarCTF week1-week4赛后复现
1-1.Yesec no drumsticks 1
1.得到一张png,根据题目名称,猜测是LSB隐写,直接用kali上的zsteg跑一下
zsteg -a 1.png
2.得到flag
flag{Yesec_1s_lsb}
1-2.qsdz's girlfriend 1
1.得到一个zip,真加密,查看注释,发现了密码的提示
2.根据常识,猜测密码就是八位有效数字,直接用ARCHPR爆破
3.得到密码,打开,得到girlfriend,Google识图,找一下叫什么
4.根据题目中flag的形式,得到flag
flag{Hikari_20031201}
1-3.Look my eyes
1.得到一张png,根据提示,猜测使用silenteye
2.decode得到密文,base64在线解码,得到flag
flag{L0ok_m3_1n_my_ey3s}
1-4.EzSnake
1.得到一个java写的小游戏,有两种办法,一种直接打通关,一种通过特殊方法,我是后者
2.根据题意,得知就是总分达到114后会出现想要的东西,使用jadx反编译游戏,得到源码文件,找关键点,即为分数大于114后的判断
3.可以看到,简单来说就是当score大于114时,会从statics的1919810找到一个名为114514的文件,并将文件进行逐位与十进制的88进行异或,那就手动模拟一下,建议直接使用010 Editor(使用winrar可以直接把jar文件拆了)
4.得到的是一个png,可以直接看到是缺少了定位点的二维码
5.补全定位点,QR扫描
6.得到密文,base64解码,得到flag
flag{Y0u_4re_0ne_oNe_0nE_st4R}
1-5.奇怪的音频
1.得到一个wav文件,使用qsstv可以得到音频中隐藏的png
2.如出现报错,可以借鉴下面的大佬的文章,更改一下qsstv的配置
https://www.srcmini.com/62326.html#heading_4
3.得到flag
flag{SSTV_and_R0b0t36}
2-1.Yesec no drumsticks 2
1.得到一个txt,发现就是一段话,首先猜测零宽度字符隐写,随便点击一列,发现实际的列数远大于显示出文字的列数
2.使用解码网站
http://330k.github.io/misc_tools/unicode_steganography.html
3.得到其中隐藏的密文,首先base58解码,得到十六进制字符串
4.使用010直接转换,得到flag
flag{Ingr3d1ent_0F_Yesec_i5_OOOOO}
2-2.Coldwinds's Desktop
1.得到的一个文件夹中有114张png,猜测就是一张png被横纵各分为十二份,首先使用脚本把png重命名一下
点击查看代码
import os
# 批量重命名文件夹中的图片文件
class BatchRename():
def __init__(self, file_path):
self.path = file_path
def rename(self):
filelist = os.listdir(self.path)
total_num = len(filelist) # 获取文件夹内所有文件个数
i = 1 # 表示文件的命名是从1开始的
for item in filelist:
if item.endswith('.PNG'):
# 初始的图片的格式为png格式的
src = os.path.join(os.path.abspath(self.path), item)
dst = os.path.join(os.path.abspath(self.path), str(i) + '.png')
try:
os.rename(src, dst)
print('converting %s to %s ...' % (src, dst))
i = i + 1
except:
continue
print('total %d to rename & converted %d jpgs' % (total_num, i))
if __name__ == '__main__':
file_path = "./" # 需要处理的文件路径
demo = BatchRename(file_path)
demo.rename()
2.使用ImageMagick
https://imagemagick.org/script/download.php#windows
或者kali的montage也可以),到拼接目录下,打开cmd,使用命令,得到乱序拼接后的png
magick montage *.png -tile 10x10 -geometry +0+0 flag.png
3.使用gaps
https://github.com/nemanja-m/gaps
得到的图片上就有flag,可以多换几个参数试试,使用gaps时建议把png放到bin目录下的gaps文件夹中
python3 gaps --image=flag.png --size=30 --population=144 --generations=64 --save
4.得到flag
flag{Y0u_successfu11y_s01ved_the_puzz1e}
2-3.奇怪的二维码
1.得到一张码,010查看文件,在文件尾发现了另一个png
2.直接手撕另存,得到一张阿兹特克的介绍
3.png本身没有发现问题,上网查了一下阿兹特克,发现Aztec码就叫阿兹特克码,补全给的图片中的定位点
4.使用网站扫码
https://zxing.org/w/decode.jspx
5.得到flag
flag{Aztec_from_Age_0f_Empires}
2-4.qsdz's girlfriend 2
1.得到一张png,首先,根据像素,就觉得这张png是被处理过的,所以说的字肯定不是现在显示出来的字,png上面的十六进制拼起来
2.上网找一下arnold是什么意思,发现是一种加密算法,直接使用脚本解密
点击查看代码
import cv2
import numpy as np
import matplotlib.image as mpimg
def arnold_decode(imgfile, outfile, shuffle_times, a, b):
image= cv2.imread(imgfile)
decode_image = np.zeros(image.shape, np.uint8)
h, w = image.shape[0], image.shape[1]
N = h
for time in range(shuffle_times):
for ori_x in range(h):
for ori_y in range(w):
new_x = ((a * b + 1) * ori_x + (-b) * ori_y) % N
new_y = ((-a) * ori_x + ori_y) % N
decode_image[new_x, new_y, :] = image[ori_x, ori_y, :]
cv2.imwrite(outfile, decode_image)
print("得到图片:" + outfile)
arnold_decode("girlfriend.png","girlfriend.png",0x61,0x726e,0x6f6c64)
3.得到的图片上的文字就是flag
flag{按理说这个点猪也该醒了}
2-5.奇怪的波形
1.首先得到两个文件,分别是加密脚本和通过脚本得到的波形图,首先分析一下脚本,可以看到其中的key就是我们要最后求得的flag
2.分析一下脚本,可以看出,循环一共16次,图中一共32个波段,那就是每运行一次,会出现两个波段
3.再看一下脚本首先会运行
tmp = S * S;
S = tmp % N;
然后根据判断,如果key[i] == 1,那就会出现一个新参数m,即新的长度的波;如果key[i] == 0,那就还是和判断前先画的波长相等
tmp = S * m;
S = tmp % N;
4.那就可以根据一组波长是否相等来判断key是0还是1
flag{0010001001100111}
3-1.Whats HTTP
1.给出的是流量,没有什么特别的标志,直接TCP流一条一条地过,在第30流发现一段编码
2.base64解码,得到十六进制字符串,010转一下,得到flag
3-2.qsdz's girlfriend 3
1.根据提示,使用Xshell连接到靶机
2.但因为是赛后复现,不知为什么连接不到靶机了
3.简单来说,思路就是连接到后使用ls命令,会看到一个flag,直接cat会提示权限不够,使用题目中给出的用户名和密码登录,会显示是低权用户,访问/etc/passwd,手动创造一个root用户,就是手动提权,使用自己创的root永辉,就可以获得flag了
3-3.WebShell!
1.根据提示,猜测是蚁剑流量,可以参考博客
https://www.csdn.net/tags/Ntjakg3sODQ3NjktYmxvZwO0O0OO0O0O.html#:~:text=由于蚁剑中包含了,蚁剑的流量特征。
2.直接搜索关键词ini_set,追踪http流,就可以发现关键信息了
3.拼起来,得到flag
flag{n3wst4r_www-data_Y0UAr3G00D}
3-4.Yesec no drumsticks 3
3-4-1.first.zip
1.得到无类型文件和一个txt,txt看了一下,发现列数与显示大小不同,猜测是零宽度隐写,使用网站看了一下字符类型
2.使用在线解密网站
http://330k.github.io/misc_tools/unicode_steganography.html
3.010查看flag,根据文件头,发现是7z文件,改后缀为7z,得到另外一个无类型文件
4.010打开,文件头提示ZIP,改后缀为zip,得到另外一个文件
5.file使用一下,得知是zip,改后缀为zip,又得到一个文件,猜测可能是套娃,就直接用脚本改后缀,解压,最后会得到一个secret.jpg(手动解压也可)
6.binwalk一下,发现jpg什么都没有,再回去看最后一个zip包,在末尾发现base64
7.在线解码,得到flag
3-5.混沌的图像
1.010查看文件头,PK,改后缀为zip
2.解压zip,得到一张png,010打开,发现IDAT块特别多,猜测有什么东西隐藏了
3.打开提示,一段base64,在线解码,得到了一段脚本
点击查看代码
img = Image.open('flag.png')
w,h=img.size
for i in range(w):
for j in range(h):
(r, g, b, a) = img.getpixel((i,j))
pic.append(r)
pic.append(g)
pic.append(b)
4.用zsteg跑一下png,发现隐藏的png信息
5.用Stegsolve打开,在全0通道发现png源码,save bin,得到png,010打开,在文件尾发现一组与png无关的数据
k1=3.5606267076894413
k2=3.9101741242346346
k=[106,80,198,220,47,18,19,230,42,202,207,196,214,132,188,190]
6.根据题目提示,猜测解密脚本与之前的某道题有关,是week1的CRYPTO的chaos,对比一下密码题给出的加密原码
" 听说之前考过LSB,那你还记得那道密码题吗?"
7.那么之前base64解码后得到的代码就是解密脚本的一部分,和密码的那个解密脚本综合一下
点击查看代码
from PIL import Image
def LC(key, x, times, flags):
(k1, k2) = key
xn = []
xn.append(x)
if flags:
xn.append(1 - 2 * xn[0]**2)
else:
xn.append(k2 * xn[0]**3 + (1 - k2)*xn[0])
for i in range(times):
assert xn[i]>=-1 and xn[i]<=1 and xn[i+1]>=-1 and xn[i+1]<=1
if flags:
xn.append((1 - 2 * xn[i]**2)*(k1 * xn[i+1]**3 + (1 - k1)*xn[i+1]))
else:
xn.append((k2 * xn[i]**3 + (1 - k2)*xn[i])*(1 - 2 * xn[i+1]**2))
return xn[times + 1]
z = 0
r = 1
k1=3.5606267076894413
k2=3.9101741242346346
k=[106,80,198,220,47,18,19,230,42,202,207,196,214,132,188,190]
for i in k:
z += i
r ^= i
a_1 = (z / 256) % 1
tmp_a = 3 + int(1000 * a_1) % 30
b_1 = (r / 256)
tmp_b = 3 + int(1000 * b_1) % 30
xc_1 = a_1 * b_1
yc_1 = (a_1 * b_1) % 1
data = (a_1,tmp_a,b_1,tmp_b,xc_1,yc_1)
key = (k1,k2)
m,c,tmp_l1,tmp_l2 = [],[],[],[]
ta = tmp_a
tb = tmp_b
img = Image.open('1.png').convert('RGBA')
w,h=img.size
for i in range(w):
for j in range(h):
(r, g, b, a) = img.getpixel((i,j))
# 获取像素值
c.append(r)
c.append(g)
c.append(b)
for flag in c:
tmp_l1.append(LC(key,a_1,ta,1))
tmp_l2.append(LC(key,b_1,tb,0))
m.append(((int(tmp_l1[-1] * 1000) + int(tmp_l2[-1] * 1000)) % 256) ^ flag)
delta = flag / 256
for i in range(3):
y = (yc_1 + delta) % 1
y = k1 * y ** 3 + (1 - k1) * y
x = xc_1
x = k2 * x ** 3 + (1 - k2) * x
ta = 3 + int(1000 * x) % 30
tb = 3 + int(1000 * y) % 30
n = 0
for i in range(w):
for j in range(h):
img.putpixel((i,j),(m[n],m[n + 1],m[n + 2]))
n = n + 3
img.save("flag.png","png")
print("OK")
img.show("flag.png")
8.然后将得到的png用Stegsolve打开,在0通道就可以看到flag
4-1.奇怪的PDF
1.首先得到一个无法打开的pdf,010查看,发现缺少文件头,补全
2.使用wbStego,无密码,得到flag
4-2.Yesec no drumsticks 4
1.下载得到一个png,提示中有一个脚本,可以看出,png就是脚本加密后的产物
2.可以看出,png的像素中潜在这flag的值,直接使用脚本提取
点击查看代码
from PIL import Image
import numpy as np
with open('./2.txt') as f :
L_path = './yellow_pictrue.png'
L_image = Image.open(L_path)
width, height = L_image.size
for h in range(height):
for w in range(width):
b = L_image.getpixel((w, h))[2]
print(chr(b),end=" ")
3.在输出中就可以找到flag
flag{Yesec_deCid3s_t0_ch4nge_7he_fate_of_the_world_against_the_odds}
4-3.还是流量分析
1.下载后得到的就是一个流量,感觉名字很有意思,查了一下是哥斯拉
2.再观察一下流量,发现大部分tcp流都有ctfsogood这部分内容,与哥斯拉流量特征相似,关于哥斯拉流量可以看一下以下这两篇文章
https://www.freebuf.com/sectool/285693.html
https://blog.csdn.net/u011250160/article/details/120501033
3.key在ctfsogood的参数中就可以找到,在第35流中可以找到secret的内容,参考一下前面博客中大佬的脚本,找一个在线网站运行,得到正确内容
flag{421eb7f1b8e4b3cf_Godzilla1sS000Int3rEstIng}
4-4.qsdz's girlfriend 4
1.得到一个密文,一个txt,一个png,密文没看懂,先用kali看一下png是否有问题,用pngcheck显示CRC错误,改一下宽高,得到图片上完整的文字
2.谷歌识图一下girlfrie.png,显示是魔女之旅
3.猜测密文与魔女之旅有关(因为不太可能给没有用的文件),上网找了一下,找到了一个魔女之旅文字,对照翻译一下
4.得知可以使用malbolge,上网查一下是什么,得知是一个编程语言,上网找一下有没有专用的编译器
5.得到flag
flag{Esol4ng_1s_es0}
4-5不奇怪的二维码
1.得到一个zip包,根据观察,感觉是一个游戏的文件源码,查找一下哪个游戏的源码文件中含有poi文件夹(因为觉得这个名字比较特殊),找到了是我的世界的存档文件,关于存档文件的格式可以看一下这个文章
https://www.bilibili.com/read/cv15742782
2.使用文章中提到的网站,upload一下zip包
3.点击下面的start upload,点击source version,点击下面的advanced mode,就可以得到地图
4.在地图上就有一个二维码
5.扫码后就可以得到flag
flag{1_1ik3_p1aying_Min3craft}