BaseCTF高校联合新生赛misc复现


week1

Base

题目描述:

1
Base啊Base,去学学编码吧

下载并查看附件Base.txt

1
KFWUM6S2KVHFKUTOOQZVUVCGNJGUOMLMLAZVE5SYGJETAYZSKZVGIR22HE======

赛博厨子一把梭

最后flag为BaseCTF{we1c0me_to_b4sectf}

根本进不去啊!

题目描述:

1
2
3
4
5
6
悄悄告诉你: flag 在 flag.basectf.fun
进不去!怎么想都进不去吧?

hint:
1.域名解析除了可以解析到 IP,似乎也可以解析到一段文本,好像有个东西叫做 dig?
2.由于域名解析有有效期,请到cdisk.imxbt.cn的WP文件夹下查看flag

域名解析查询 TXT 记录

最后flag为BaseCTF{h0h0_th1s_15_dns_rec0rd}

倒计时?海报!

题目描述:

1
2
3
4
5
6
海报可真好看,嘶,好像有什么不对劲,再仔细看看?
海报在群相册中可以找到,字体是 Jetbrains Mono (https://www.jetbrains.com/lp/mono/)

hint:
可以私聊出题人发送你们的 flag,出题人可以说是哪一段错了,不浪费大家眼睛了
字体是 Jetbrains Mono

下载海报图片

使用stegsolve查看图片10-1通道









最后依次拼接flag为BaseCTF{c0unt_d0wn_fro3_X_every_d@y_i5_re@11y_c0o1_@nd_h@rd_t0_do_1t_ev3ry_n1ght}

海上遇到了鲨鱼

题目描述:

1
来看看网络鲨鱼吧

下载附件

tcp追踪流

逆序即可

最后flag为BaseCTF{15ef386b-a3a7-7344-3b05-ac367316fb76}

正着看还是反着看呢?

题目描述:

1
从头走到尾?从尾走到头?

下载附件

无后缀文件,放进010查看

发现是jpg文件,但字节翻转了,直接加后缀.jpg使用b神工具反转

查看图片

章若楠! 尝试foremost分离

最后flag为BaseCTF{h3ll0_h4cker}

人生苦短,我用Python

题目描述:

1
Python写起来比C语言快多了,诶嘿~

下载附件得到源码

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
55
56
57
58
59
60
61
62
63
64
65
66
import base64
import hashlib

def abort(id):
print('You failed test %d. Try again!' % id)
exit(1)

print('Hello, Python!')
flag = input('Enter your flag: ')

if len(flag) != 38:
abort(1)

if not flag.startswith('BaseCTF{'):
abort(2)

if flag.find('Mp') != 10:
abort(3)

if flag[-3:] * 8 != '3x}3x}3x}3x}3x}3x}3x}3x}':
abort(4)

if ord(flag[-1]) != 125:
abort(5)

if flag.count('_') // 2 != 2:
abort(6)

if list(map(len, flag.split('_'))) != [14, 2, 6, 4, 8]:
abort(7)

if flag[12:32:4] != 'lsT_n':
abort(8)

if '😺'.join([c.upper() for c in flag[:9]]) != 'B😺A😺S😺E😺C😺T😺F😺{😺S':
abort(9)

if not flag[-11].isnumeric() or int(flag[-11]) ** 5 != 1024:
abort(10)

if base64.b64encode(flag[-7:-3].encode()) != b'MG1QbA==':
abort(11)

if flag[::-7].encode().hex() != '7d4372733173':
abort(12)

if set(flag[12::11]) != {'l', 'r'}:
abort(13)

if flag[21:27].encode() != bytes([116, 51, 114, 95, 84, 104]):
abort(14)

if sum(ord(c) * 2024_08_15 ** idx for idx, c in enumerate(flag[17:20])) != 41378751114180610:
abort(15)

if not all([flag[0].isalpha(), flag[8].islower(), flag[13].isdigit()]):
abort(16)

if '{whats} {up}'.format(whats=flag[13], up=flag[15]).replace('3', 'bro') != 'bro 1':
abort(17)

if hashlib.sha1(flag.encode()).hexdigest() != 'e40075055f34f88993f47efb3429bd0e44a7f479':
abort(18)

print('🎉 You are right!')
import this

分析代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1.长度检查:flag的长度必须为38个字符。
2.前缀检查:flag必须以BaseCTF{开头。
3.特定字符位置检查:字符串中'Mp'的位置必须在第11位和第12位(索引从0开始)。
4.后缀重复检查:flag的最后三个字符重复八次后,必须与给定的字符串相等。
5.最后一个字符检查:flag的最后一个字符必须是'}'(ASCII码为125)。
6.下划线数量检查:flag中下划线的数量除以2的结果必须是2,即下划线总数为4。
7.分割后长度检查:flag以下划线为分隔符分割后,各部分的长度必须为[14, 2, 6, 4, 8]。
8.步长切片检查:flag中从第13个字符开始,每隔4个字符取一个,得到的字符串应为lsT_n。
9.特定字符大写并插入表情符号检查:flag的前9个字符大写后,每个字符之间插入😺,得到的字符串应与给定的相等。
10.倒数第11个字符的数字五次方检查:flag的倒数第11个字符必须是数字,且其五次方等于1024(即2的5次方)。
11.base64编码检查:flag中倒数第7到倒数第4个字符的base64编码应为MG1QbA==。
12.反转步长编码检查:将flag以步长-7反转后,得到的字符串的十六进制编码应为7d4372733173。
13.特定步长字符集合检查:从flag的第13个字符开始,每隔11个字符取一个,得到的字符集合必须是{'l', 'r'}。
14.特定区间字节检查:flag的第22到第27个字符的字节表示必须与给定的字节序列相等。
15.加权和检查:flag的第18到第20个字符,每个字符的ASCII码乘以一个特定数字(可能是日期2024年8月15日的某种表示)的幂次(从0开始),求和后的结果必须与给定的数字相等。
16.字符类型检查:flag的第一个字符必须是字母,第八个字符必须是小写字母,第十三个字符必须是数字。
17.字符串格式化检查:将flag的第14个字符和第16个字符格式化到字符串'{whats} {up}'中,并将所有的3替换为bro,结果应为bro 1。
18.SHA1哈希检查:flag的SHA1哈希值必须与给定的哈希值相等。

编写脚本:

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
import base64
import string
from itertools import accumulate, product

n = 38
ind = list(range(n))
flag = [' ']*n

for i, c in enumerate("BaseCTF{"):
flag[i] = c

flag[10:12] = list("Mp")

flag[-3:] = list("3x}")

flag[-1] = chr(125)

for i, ind in enumerate(accumulate([14, 2, 6, 4, 8][:-1])):
flag[i+ind] = '_'
# assert list(map(len, "".join(flag).split('_'))) == [14, 2, 6, 4, 8], str(list(map(len, "".join(flag).split('_'))))

flag[12:32:4] = list("lsT_n")

# flag[8] = 'S'
flag[8] = 's'

flag[-11] = '4'

flag[-7:-3] = list(base64.b64decode('MG1QbA==').decode())

flag[::-7] = list(bytes.fromhex("7d4372733173").decode())

# set(flag[12::11]) == {'l', 'r'}

flag[21:27] = list(bytes([116, 51, 114, 95, 84, 104]).decode())

for _c in product(string.printable, repeat=2):
_s = [flag[17], *_c]
if sum(ord(c) * 2024_08_15 ** idx for idx, c in enumerate(_s)) == 41378751114180610:
flag[17:20] = _s
break

flag[13] = '3'
flag[15] = '1'

print("".join(flag))

运行得到

最后flag为BaseCTF{s1Mpl3_1s_BeTt3r_Th4n_C0mPl3x}

你也喜欢圣物吗

题目描述:

1
2
3
4
5
鲁迪是个老hentai!

hint:
where_is_key.zip真的需要密码,再找找
看到假flag的同时,真flag已经出来了,再看看

下载附件

010查看图片发现有末尾有base编码

base解码

lsb隐写,直接zsteg一把梭

得到压缩包密码:lud1_lud1 解压压缩包

伪加密 直接用工具一把梭

查看flag.txt

根据提示:看到假flag的同时,真flag已经出来了,再看看

直接base解码第二个

最后flag为BaseCTF{1u0_q1_x1_51k1}

捂住X只耳

题目描述:

1
2
3
4
5
6
7
8
这个「立体声」的世界充满了纷扰和喧嚣,我们很容易被他人的意见和声音所左右,无心观赏花朵的美丽、雪花的别致,甚至连沁人的微风、皎柔的月光都不曾留意。在意他人的看法,关注外界的评论,沉迷冗杂的信息,这些都在消耗着我们的时间和精力。如何才能在这个纷繁复杂的世界里保持自己的独立思考呢?答案就是——拥有屏蔽力。

注意: 本题 flag 需自行补上 BaseCTF{} ,大括号中内容为 15 个字母,提交时全部大写或全部小写。
温馨提示: 本题考点和解法与 MoeCTF 「捂住一只耳」并不相关,在 MoeCTF 结束前请勿公开讨论 MoeCTF 赛题。
隐写存在于声音中,与文件格式无关(与 mp3stego 无关,与 private bit 无关)
可以在网上搜搜「CTF misc 音频」看看还可能有什么做法
可以多看几眼题目描述
左物右码。(本题不再发布更多提示)

下载附件

将音频丢入 Auduacity,先把左右声道分开

然后选中其中一个声道,应用上下反相效果

接着选中两个声道,合并它们,查看新轨道声道频谱发现是摩斯密码

手动记录长短

1
..-. --- .-.. .-.. --- .-- -.-- --- ..- .-. .... . .- .-. -

摩斯解码

最后flag为BaseCTF{FOLLOWYOURHEART}

week2

Base?!

题目描述:

1
You love base?

下载并查看附件Base_!.txt

1
2
3
4
5
6
7
hS5VZPaBjN4IU6G2VFqZqNG-tPrJm64NgMKQuEa3nNIBIFbh0MLBZEpF4LqZn
9LpBjLoRjPqEV6Lo+

question response

Base64? X
Base32? X

xxencode解码

最后flag为BaseCTF{BaseCTF_is_So_Good!!}

ez_crypto

题目描述:

1
Base你都不服,你服啥,扶他吗?

下载并打开附件ez_crypto.txt

1
qMfZzunurNTuAdfZxZfZxZrUx2v6x2i0C2u2ngrLyZbKzx0=

base换表

最后flag为BaseCTF{Th1s_1s_4n_ez_b4se64dec0de}

二维码1-街头小广告

题目描述:

1
Naril 在街头见到地上有一张印有二维码的小广告,好像还被人踩了一脚

下载附件

ps补充定位符并扫描二维码

url解码

最后flag为BaseCTF{QR_Code_1s_A_f0rM_Of_m3s5ag3}

哇!珍德食泥鸭

题目描述:

1
flag藏哪了?仔细找找吧 可能就在眼前哦

下载附件

foremost分离文件

打开docx文件

常规套路:全选加改颜色加移除图片

最后flag为BaseCTF{a651c13d-9600-437e-90ca-40d740fa7cb4}

反方向的雪

题目描述:

1
2
3
4
低头看雪?

hint:
压缩包密码为6位

下载附件

010查看文件

发现末尾是zip文件,但字节翻转了,先新建一个空白的文件

保存为xue.zip,赛博厨子反转

保存并打开文件

爆破密码

解压压缩包得到

snow隐写

最后flag为BaseCTF{Y0u_g0t_1t!}

黑丝上的flag

题目描述:

1
关注VY-netcat喵, star关注VY-netcat谢谢喵

下载附件

stegsolve查看通道得到flag

最后flag为BaseCTF{Bl4ck_5ilk_1s_the_be5t}

海上又遇了鲨鱼

题目描述:

1
怎么又看到网络鲨鱼了?!!

ctfnat-A一把梭

解压压缩包得到

最后flag为BaseCTF{W1r3sharK_3at_r3p3at_paSsw0rd}

前辈什么的最喜欢了

题目描述:

1
明日风是出题人老婆

下载附件

base转图片

保存并打开图片

宽高一把梭

最后flag为BaseCTF{q1n6_k4n_zh3_w0}

week3

broken.mp4

题目描述:

1
2
3
破防时刻:录屏录到一半,断电关机了。签个到吧

BaseCTF Week2 讲解视频 (broken).mp4

下载附件

录制1

录制2

视频损坏,查找录制1里面的文章出处在这

【视频图像篇】MP4受损视频修复方法(一)_untrunc-CSDN博客

untrunc视频修复

生成一个修复好的视频文件,查看

最后flag为BaseCTF{x1a_Ci_1_DIn9_y0Ng_MKV}

白丝上的flag

题目描述:

1
2
3
4
某出题人赠送大家flag时遭遇了信号干扰, 幸好我们在不知名小网站找到了写入flag前的图片, 尝试还原信息吧!

hint:
flag是单色

下载附件

task.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
from PIL import Image
from random import randint
import sys

def ez_add(a,b,c,d):
global iv
h = (a+b+c+d+iv) % 256
e = b
f = c
g = d
iv = (b+c+d+iv) % 256
return e,f,g,h

def confuse(data):
r,g,b,a = data
for _ in range(8):
r,g,b,a = ez_add(r,g,b,a)
return r,g,b,a

def confuse_image(flag):
global iv
iv = flag.getpixel((1,1))[0]
img = Image.new('RGBA', (flag.width, flag.height))
for w in range(img.width):
for h in range(img.height):
img.putpixel((w, h), confuse(flag.getpixel((w,h))))
return img

if __name__ == '__main__':
iv = 0
flag = Image.open("./de_image.png")
img = confuse_image(flag)
img.save("en_image.png")

解密思路:

  1. 逆向 confuse 函数: 由于 confuse 函数是对像素进行简单的加法运算,我们可以通过逆向运算来解密。
  2. 单色图像特点: 单色图像的每个像素的 RGB 值都相同,我们可以利用这个特点来简化解密过程。

exp:

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
from PIL import Image

def ez_sub(h, e, f, g):
global iv
a = (h - e - f - g - iv) % 256
iv = (e + f + g + iv) % 256
return a

def unconfuse(data):
r, g, b, a = data
for _ in range(8):
r = ez_sub(r, g, b, a)
return r, g, b, a

def unconfuse_image(img):
global iv
iv = img.getpixel((1, 1))[0]
flag = Image.new('RGBA', (img.width, img.height))
for w in range(img.width):
for h in range(img.height):
flag.putpixel((w, h), unconfuse(img.getpixel((w, h))))
return flag

if __name__ == '__main__':
iv = 0
img = Image.open("E:\\脚本合集\\赛题脚本\\basectf\\白丝上的flag\\en_image.png")
flag = unconfuse_image(img)
flag.save("E:\\脚本合集\\赛题脚本\\basectf\\白丝上的flag\\de_image_decrypted.png")

运行得到

使用stegsolve查看通道

最后flag为BaseCTF{there_is_the_flag@}

这是一个压缩包

题目描述:

1
不要只会用工具噢

下载附件

base解码

中间缺少6位?,样式是对称的 利用python中zipfile,简单写个脚本爆破一下即可

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
import zipfile
zfile=zipfile.ZipFile("E:\\脚本合集\\赛题脚本\\basectf\\这是一个压缩包\\这是一个压缩包.zip",'r')

for i in range(33,128):
for j in range(33,128):
for k in range(33,128):
mask="BaseCTF"+chr(i)+chr(j)+chr(k)+chr(k)+chr(j)+chr(i)+"FTCesaB"
try:
zfile.extractall(pwd=mask.encode('utf-8'))
print(mask)
exit()
except:
pass

运行得到

解压压缩包得到

最后flag为BaseCTF{a7da6763-5013-4963-9c23-8fb3d049bdce}

纯鹿人

题目描述:

1
想必之前的第一题没有难倒你吧?鸽鸽很满意,那我们再试试这个叭

下载附件

删图片全选改颜色

base编码

改文件后缀为zip,提取word文件里的图片,进行分离

解压压缩包

最后flag为BaseCTF{d176adc7-5919-4a0c-9556-0301fc4d9c35}

外星信号

题目描述:

1
2
3
4
在一次秘密任务中截获到了一段对话,地球人向地外发送了一段秘语,外星返回了一段外星信号,赶快来破译密码吧(flag小写)

hint:
嘶....音频播放时长和总时长不不对劲啊

下载附件

摩斯密码解码

foremost分离

解压压缩包

无线隐写–sstv

摩斯密码

1
2
3
4
5
....-/----./.-/....-/-....-/.-/
----./----./..---/-....-/...-
-/-.../-.../-../...../-..../..-./
...--/..-./-../-----/-.../---
-.-

摩斯解码

拼接flag,转小写,最后flag为BaseCTF{2ebe6fdc-60dc-49a4-a992-3bbd56f3fd0b}

我要吃火腿!

题目描述:

1
火腿——

下载附件

我要吃火腿!.txt

1
~呜嗷嗷嗷嗷呜啊嗷呜~呜嗷呜呜~嗷~嗷啊嗷啊呜嗷嗷嗷呜~嗷~呜嗷嗷~~嗷嗷嗷呜啊呜啊~呜嗷呜呜~嗷呜啊啊嗷啊呜嗷呜~呜~嗷~呜嗷~~啊嗷嗷嗷呜啊呜啊啊呜嗷呜呜~嗷嗷嗷啊嗷啊呜嗷呜~~~嗷~呜呜嗷呜~嗷嗷嗷呜呜~嗷啊呜嗷呜呜~嗷~~啊嗷啊呜嗷嗷~嗷~嗷~呜呜嗷~嗷嗷嗷嗷呜呜嗷啊~呜嗷呜呜~嗷嗷嗷啊嗷啊呜嗷嗷啊呜~嗷~呜呜呜~~嗷嗷嗷呜啊呜啊嗷呜嗷呜呜~呜啊~啊嗷啊呜~~啊啊~嗷~呜呜嗷呜呜嗷嗷嗷呜啊嗷~嗷呜嗷呜呜~嗷嗷~啊嗷啊呜嗷嗷嗷嗷~嗷~呜嗷嗷啊~嗷嗷嗷呜呜嗷嗷~呜嗷呜呜~嗷呜啊啊嗷啊呜嗷呜嗷嗷~嗷~呜呜呜嗷~嗷嗷嗷呜啊呜嗷~呜嗷呜呜~呜~嗷啊嗷啊呜嗷呜~~~嗷~呜嗷~~啊嗷嗷嗷呜啊嗷啊呜呜嗷呜呜~嗷嗷嗷啊嗷啊呜嗷嗷呜~~嗷~呜呜嗷呜嗷嗷嗷嗷呜呜嗷~嗷呜嗷呜呜啊呜嗷呜啊嗷啊呜啊啊呜呜~嗷~呜嗷嗷~~嗷嗷嗷呜呜嗷嗷~呜嗷呜呜啊嗷呜~啊嗷啊呜~嗷啊~~嗷~呜呜嗷呜~嗷嗷嗷呜啊嗷呜嗷呜嗷呜呜~嗷呜嗷啊嗷啊呜~~啊啊~嗷~呜呜嗷嗷呜嗷嗷嗷呜啊呜~嗷呜嗷呜呜~呜啊~啊嗷啊呜嗷嗷嗷嗷~嗷~呜呜呜嗷啊嗷嗷嗷呜呜嗷嗷~呜嗷呜呜啊呜呜嗷啊嗷啊呜~嗷啊~~嗷~呜嗷~啊啊嗷嗷嗷呜呜呜嗷~呜嗷呜呜~呜~~啊嗷啊呜~呜~~~嗷~呜嗷呜呜~嗷嗷嗷呜呜嗷~~呜嗷呜呜啊嗷呜~啊嗷啊呜~呜啊~~嗷~呜呜呜呜~嗷嗷嗷呜呜呜啊呜呜嗷呜呜啊呜啊嗷啊嗷啊呜~嗷呜~~嗷~呜嗷嗷~~嗷嗷嗷呜呜呜嗷~呜嗷呜呜~呜~~啊嗷啊呜~呜嗷呜~嗷~呜嗷啊嗷~嗷嗷嗷呜呜~嗷嗷呜嗷呜呜呜啊嗷呜啊嗷啊呜~嗷啊~~嗷~呜嗷嗷~~嗷嗷嗷呜呜嗷嗷~呜嗷呜呜啊嗷呜~啊嗷啊呜啊啊呜呜~嗷~呜嗷嗷~~嗷嗷嗷呜呜嗷嗷~呜嗷呜呜啊嗷呜~啊嗷啊呜~嗷啊~~嗷~呜呜呜呜啊嗷嗷嗷呜啊嗷~嗷呜嗷呜呜~呜啊~啊嗷啊呜嗷嗷嗷~~嗷~呜嗷嗷~~嗷嗷嗷呜啊嗷嗷啊呜嗷呜呜~呜呜~啊嗷啊呜嗷嗷嗷嗷~嗷~呜呜嗷~呜嗷嗷嗷呜呜嗷啊~呜嗷呜呜~嗷嗷嗷啊嗷啊呜嗷嗷啊呜~嗷~呜呜呜~~嗷嗷嗷呜啊呜啊嗷呜嗷呜呜~呜啊~啊嗷啊呜~~啊啊~嗷~呜呜嗷呜呜嗷嗷嗷呜啊嗷~嗷呜嗷呜呜~嗷嗷~啊嗷啊呜嗷嗷嗷嗷~嗷~呜嗷嗷啊~嗷嗷嗷呜呜嗷嗷~呜嗷呜呜啊嗷~啊啊嗷啊呜嗷呜~呜~嗷~呜呜嗷嗷呜嗷嗷嗷呜呜嗷啊啊呜嗷呜呜啊嗷嗷嗷啊嗷啊呜~嗷啊~~嗷~呜呜嗷嗷嗷嗷嗷嗷呜啊呜呜啊呜嗷呜呜啊嗷呜~啊嗷啊呜嗷嗷嗷呜~嗷~呜嗷呜啊呜嗷嗷嗷呜嗷啊~呜呜嗷呜呜啊嗷呜~啊嗷啊呜~嗷啊~~嗷~呜嗷嗷~~嗷嗷嗷呜呜嗷嗷~呜嗷呜呜啊嗷呜~啊嗷啊呜~嗷啊~~嗷~呜嗷嗷~~嗷嗷嗷呜呜嗷嗷~呜嗷呜呜~嗷啊~啊嗷啊呜嗷嗷~嗷~嗷~呜呜呜嗷~嗷嗷嗷呜啊嗷呜嗷呜嗷呜呜啊嗷呜~啊嗷啊呜~呜啊嗷~嗷~呜嗷嗷~~嗷嗷嗷呜啊嗷呜呜呜嗷呜呜~呜嗷嗷啊嗷啊呜嗷呜~~~嗷~呜呜嗷呜嗷嗷嗷嗷呜啊嗷呜嗷呜嗷呜呜~呜啊呜啊嗷啊呜嗷呜~呜~嗷~呜呜嗷嗷嗷嗷嗷嗷呜啊呜~嗷呜嗷呜呜啊嗷~~啊嗷啊呜嗷嗷嗷呜~嗷~呜嗷嗷~呜嗷嗷嗷呜啊呜呜呜呜嗷呜呜~嗷~嗷啊嗷啊呜嗷嗷~嗷~嗷~呜呜嗷嗷~嗷嗷嗷呜呜嗷啊~呜嗷呜呜啊嗷嗷嗷啊嗷啊呜~嗷呜嗷~嗷~呜~啊啊呜嗷嗷嗷呜嗷啊~呜呜嗷呜呜啊嗷呜~啊嗷啊呜~嗷啊~~嗷~呜嗷嗷~~嗷嗷嗷呜呜嗷嗷~呜嗷呜呜~嗷~呜啊嗷啊呜嗷嗷啊啊~嗷~呜呜呜嗷呜嗷嗷嗷呜呜嗷嗷~呜嗷呜呜~嗷嗷嗷啊嗷啊呜~嗷啊~~嗷~呜呜嗷啊嗷嗷嗷嗷呜啊嗷嗷呜呜嗷呜呜啊嗷呜~啊嗷啊呜嗷呜~呜~嗷~呜呜嗷嗷嗷嗷嗷嗷呜啊嗷嗷呜呜嗷呜呜~嗷~啊啊嗷啊呜嗷嗷嗷嗷~嗷~呜嗷嗷呜~嗷嗷嗷呜啊嗷~~呜嗷呜呜~嗷~嗷啊嗷啊呜嗷嗷啊呜~嗷~呜嗷嗷呜~嗷嗷嗷呜啊嗷呜~呜嗷呜呜~嗷啊嗷啊嗷啊呜嗷呜~~~嗷~呜呜嗷嗷嗷嗷嗷嗷呜呜嗷~嗷呜嗷呜呜啊嗷嗷嗷啊嗷啊呜~呜呜呜~嗷~呜~啊啊呜嗷嗷嗷呜呜嗷嗷~呜嗷呜呜啊嗷呜~啊嗷啊呜~嗷啊~~嗷~呜嗷嗷~~嗷嗷嗷呜呜嗷嗷~呜嗷呜呜啊嗷呜~啊嗷啊呜~嗷啊~~嗷~呜嗷嗷~~嗷嗷嗷呜啊嗷呜~呜嗷呜呜~嗷啊嗷啊嗷啊呜嗷呜~~~嗷~呜呜嗷嗷嗷嗷嗷嗷呜呜~~啊呜嗷呜呜~嗷嗷嗷啊嗷啊呜~~啊嗷~嗷~呜嗷嗷~~嗷嗷嗷呜呜~嗷呜呜嗷呜呜啊呜呜嗷啊嗷啊呜~嗷啊~~嗷~呜呜嗷呜~嗷嗷嗷呜啊嗷呜嗷呜嗷呜呜~嗷呜嗷啊嗷啊呜~~啊啊~嗷~呜呜嗷嗷呜嗷嗷嗷呜啊呜~嗷呜嗷呜呜~呜啊~啊嗷啊呜嗷嗷嗷嗷~嗷~呜呜呜嗷啊嗷嗷嗷呜呜~~啊呜嗷呜呜~嗷嗷嗷啊嗷啊呜~嗷啊~~嗷~呜嗷嗷呜嗷嗷嗷嗷呜呜嗷嗷~呜嗷呜呜啊呜啊啊啊嗷啊呜~~啊嗷~嗷~呜~啊啊呜嗷嗷嗷呜嗷啊~呜呜嗷呜呜啊嗷呜~啊嗷啊呜~嗷啊~~嗷~呜嗷嗷~~嗷嗷嗷呜呜嗷嗷~呜嗷呜呜~呜~啊啊嗷啊呜嗷嗷呜嗷~嗷~呜呜呜嗷~嗷嗷嗷呜啊嗷啊~呜嗷呜呜啊嗷呜~啊嗷啊呜嗷嗷啊啊~嗷~呜呜呜~~嗷嗷嗷呜啊嗷啊嗷呜嗷呜呜~嗷呜呜啊嗷啊呜~嗷嗷~~嗷~呜呜嗷~啊嗷嗷嗷呜啊呜啊嗷呜嗷呜呜~呜啊~啊嗷啊呜嗷呜啊~~嗷~呜呜呜呜嗷嗷嗷嗷呜啊呜呜~呜嗷呜呜啊~呜啊啊嗷啊呜嗷嗷嗷呜~嗷~呜呜嗷啊嗷嗷嗷嗷呜啊嗷~~呜嗷呜呜~嗷~嗷啊嗷啊呜~嗷呜~~嗷~呜嗷嗷~~嗷嗷嗷呜呜嗷啊啊呜嗷呜呜~呜~啊啊嗷啊呜嗷嗷~呜~嗷~呜嗷嗷呜啊嗷嗷嗷呜呜嗷~嗷呜嗷呜呜啊嗷呜~啊嗷啊呜嗷嗷~嗷~嗷~呜呜呜嗷啊嗷嗷嗷呜呜嗷嗷~呜嗷呜呜~嗷~呜啊嗷啊呜~呜呜呜~嗷~呜~啊啊呜嗷嗷嗷呜呜嗷嗷~呜嗷呜呜啊嗷呜~啊嗷啊呜~嗷啊~~嗷~呜嗷嗷~~嗷嗷嗷呜呜嗷嗷~呜嗷呜呜啊嗷呜~啊嗷啊呜~嗷啊~~嗷~呜嗷嗷~~嗷嗷嗷呜啊嗷啊呜呜嗷呜呜啊嗷呜呜啊嗷啊呜嗷呜嗷啊~嗷~呜呜呜嗷呜嗷嗷嗷呜啊嗷~嗷呜嗷呜呜~呜啊~啊嗷啊呜嗷嗷嗷嗷~嗷~呜嗷嗷呜~嗷嗷嗷呜啊嗷呜~呜嗷呜呜~嗷啊嗷啊嗷啊呜嗷呜~~~嗷~呜呜嗷嗷嗷嗷嗷嗷呜呜嗷~嗷呜嗷呜呜呜啊嗷呜啊嗷啊呜啊啊呜呜~嗷~呜呜呜呜~嗷嗷嗷呜啊嗷嗷啊呜嗷呜呜~呜啊呜啊嗷啊呜~~啊啊~嗷~呜呜呜呜啊嗷嗷嗷呜啊嗷~嗷呜嗷呜呜~呜啊~啊嗷啊呜嗷嗷嗷~~嗷~呜嗷~~啊嗷嗷嗷呜啊嗷啊~呜嗷呜呜~嗷啊嗷啊嗷啊呜嗷嗷啊嗷~嗷~呜嗷嗷呜~嗷嗷嗷呜呜嗷啊啊呜嗷呜呜啊啊~~啊嗷啊呜嗷嗷~嗷~嗷~呜呜嗷~嗷嗷嗷嗷呜啊嗷嗷啊呜嗷呜呜~呜啊呜啊嗷啊呜嗷嗷呜~~嗷~呜嗷嗷~呜嗷嗷嗷呜啊嗷~呜呜嗷呜呜~呜呜~啊嗷啊呜嗷嗷嗷啊~嗷~呜嗷嗷呜啊嗷嗷嗷呜呜嗷~~呜嗷呜呜啊嗷呜~啊嗷啊呜~嗷嗷啊~嗷~呜嗷啊呜~嗷嗷嗷呜啊嗷呜嗷呜嗷呜呜~嗷呜嗷啊嗷啊呜~嗷啊呜~嗷~呜呜嗷啊呜嗷嗷嗷呜啊呜嗷~呜嗷呜呜~嗷~啊啊嗷啊呜~嗷嗷啊~嗷~呜嗷嗷啊嗷啊

兽语解密

解码得到

1
2
3
4
5
6
7
8
9
10
11
12
13
def xor_with_ham(input_file, output_file):
ham_bytes = [0x48, 0x61, 0x6D]

with open(input_file, 'rb') as f:
data = bytearray(f.read())

for i in range(len(data)):
data[i] ^= ham_bytes[i % 3]

with open(output_file, 'wb') as f:
f.write(data)

xor_with_ham('Hamorl.jpg', 'Ham.jpg')

解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def xor_with_ham_decrypt(input_file, output_file):
ham_bytes = [0x48, 0x61, 0x6D]

with open(input_file, 'rb') as f:
data = bytearray(f.read())

for i in range(len(data)):
data[i] ^= ham_bytes[i % 3]

with open(output_file, 'wb') as f:
f.write(data)


# 使用函数解密
xor_with_ham_decrypt('E:\\脚本合集\\赛题脚本\\basectf\\我要吃火腿\\Ham.jpg', 'E:\\脚本合集\\赛题脚本\\basectf\\我要吃火腿\\Hamorl.jpg')

运行得到

foremost分离文件

无线隐写–sstv

最后flag为BaseCTF{SSTV_Happpy!}

Base revenge

题目描述:

1
Not just Base

下载并打开附件Base revenge.txt

base隐写

提示放在随波逐流看看 {Gs1h_1h_nb_srmg}

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from string import ascii_lowercase, ascii_uppercase

def atbashAttack(plaintext: str):
dir_atbash_lower = ascii_lowercase[::-1]
dir_atbash_upper = ascii_uppercase[::-1]
res = ''
for s in plaintext:
if s.isupper():
res += dir_atbash_upper[ascii_uppercase.index(s)]
elif s.islower():
res += dir_atbash_lower[ascii_lowercase.index(s)]
else:
res += s
return res

plaintext = 'JnUaAFMFImgANSEuAWYuBE9SyaYpC2ldBrU9'
ciphertext = atbashAttack(plaintext)
print("Atbash解密结果:", ciphertext)

运行得到 QmFzZUNURntZMHVfZDBfYV9HbzBkX2owYiF9

base解密

最后flag为BaseCTF{Y0u_d0_a_Go0d_j0b!}

week4

小cheny的社交

题目描述:

1
2
3
4
5
cheny最近又是学习又是打ctf太忙了0vo,忙的把账号都藏起来了

hint:
为了防止资源过期,请各位师傅实在找不到再看flag
BaseCTF{h4h_y0u_kn0w_ch3ny}

下载附件

stegsolve查看通道

赛博厨子一把梭

通过qq找到一个账号,空间里视频的简介中找到up主发的动态,在动态找到一段尊嘟假嘟密文

1
Övo 0vO O.0 OwÖ Ö_0 Ö.o Öw0 Ö.o Öv0 0vÖ 0_0 0.o Öw0 O.O 0w0 o_Ö o_O ÖvÖ Ov0 ow0 Ö.Ö Owo

尊嘟假嘟解密

个人签名中发现博客,在博客中发现尊嘟假嘟密文

1
o.O owO ovo Owo o_0 ow0 o.0 0wÖ o.O OvÖ Öw0 0_O o_O Ö.Ö owo O_O

尊嘟假嘟解密

最后flag为BaseCTF{h4h_y0u_kn0w_ch3ny}

二维码2-阿喀琉斯之踵

题目描述:

1
2
3
我承认 QR Code 自动纠错能力很强,足以应对生活场景。可如果失去了骨架,阁下又该如何应对呢?

「基础不牢,地动山摇。」

下载附件

修复二维码首先了解二维码组成

时序部分使解码器准确定位数据块。对于所有符合规范的 QR Code,这一行和一列都是黑白相间。于是上图绿色区域可以完全确定。

格式信息包含“掩码”和“纠错等级”,长度为 15 个 0/1,例如001011010001001

掩码有8种,分别对应一些固定位置,对一个二维码的这些位置取反后,得到的才是原本的0和1(这是为了避免二维码中出现一大片黑或白等情况);纠错等级有4种,表示数据码和纠错码分别占多少,即一个位置是数据码还是纠错码。

如果没有格式信息,解码器甚至不知道某个位置上黑色的码元表示0还是1。这是一个非常重要的区域,所以 QR Code 将它重复了两遍(红色和黄色)。上图 1-15 表示对应位置是从左数第几位。此区域不施加掩码。

所以排列组合一下,格式信息总共只有8*4=32种情况。因为数量不多,只需要枚举一下,看哪个格式信息能让题目的二维码可解码出结果(其他情况不可解码,是因为按那种情况解下去,纠错码会发现太多错误)。

exp:

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
from PIL import Image, ImageDraw
import pyzbar.pyzbar as pyzbar

img = Image.open('E:\\脚本合集\\赛题脚本\\basectf\\修复二维码\\qrcode-2.png')
img_draw = ImageDraw.Draw(img)

def get_module(x, y):
return 0 if 255 == img.getpixel((20*x+40+10, 20*y+40+10))[0] else 1

def set_module(x, y, v):
img_draw.rectangle((20*x+40, 20*y+40, 20*x+40+19, 20*y+40+19),
fill=(0, 0, 0) if v else (255, 255, 255))

# Timing patterns

for x in range(8, 41-8):
set_module(x, 6, ~x&1)

for y in range(8, 41-8):
set_module(6, y, ~y&1)

# Bruteforce format information

FORMATS = '''L 0 111011111000100
L 1 111001011110011
L 2 111110110101010
L 3 111100010011101
L 4 110011000101111
L 5 110001100011000
L 6 110110001000001
L 7 110100101110110
M 0 101010000010010
M 1 101000100100101
M 2 101111001111100
M 3 101101101001011
M 4 100010111111001
M 5 100000011001110
M 6 100111110010111
M 7 100101010100000
Q 0 011010101011111
Q 1 011000001101000
Q 2 011111100110001
Q 3 011101000000110
Q 4 010010010110100
Q 5 010000110000011
Q 6 010111011011010
Q 7 010101111101101
H 0 001011010001001
H 1 001001110111110
H 2 001110011100111
H 3 001100111010000
H 4 000011101100010
H 5 000001001010101
H 6 000110100001100
H 7 000100000111011'''.split('\n')

# 红色部分坐标
GROUP1 = [
(0, 8), (1, 8), (2, 8), (3, 8), (4, 8),
(5, 8), (7, 8), (8, 8), (8, 7), (8, 5),
(8, 4), (8, 3), (8, 2), (8, 1), (8, 0),
]

# 黄色部分坐标
GROUP2 = [
(8, 40), (8, 39), (8, 38), (8, 37), (8, 36),
(8, 35), (8, 34), (33, 8), (34, 8), (35, 8),
(36, 8), (37, 8), (38, 8), (39, 8), (40, 8),
]

for fmt in FORMATS:
level, mask, fmtstr = fmt.split()

# 填图
for i, c in enumerate(fmtstr):
x, y = GROUP1[i]
set_module(x, y, int(c))
x, y = GROUP2[i]
set_module(x, y, int(c))

# 存图
# img.save(f'output/{level}{mask}.png')

# 解码
res = pyzbar.decode(img)
if res:
print(level, mask, res[0].data.decode())
else:
print(level, mask, 'None')

运行得到flag

最后flag为BaseCTF{tH3_cRe4tOr_0f_QR_F0rM4t_1s_a_9en1u5}

New Base

题目描述:

1
2
3
4
5
6
已经做了三周 Base,想必你已经理解 Base 的原理了吧!

BaseCTF!
Flag 大括号内只有大写字母、小写字母、下划线。

本题有三种预期解法。

下载附件

进制转换

Base8是用 B a s e C T F ! 分别表示 000 001 … 110 111

八进制是用 0 1 2 3 4 5 6 7 分别表示 000 001 … 110 111

所以字符集替换一下,就可以直接用编程语言已有的进制转换方法

进制转换得到的是整数,可以按 long_to_bytes 的原理转为字节(实际上内存中的整数也是一组字节)

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
with open('E:\\脚本合集\\赛题脚本\\basectf\\basebase\\new-base.txt', 'r') as f:
code = f.readlines()[1]

# 单表替换为 0-7
code_digit8 = code.translate(str.maketrans('BaseCTF!', '01234567'))

# 原因同解法一
assert len(code) % 8 == 0

three_bytes_seq_result = []

# 每 8 个符号变成 3 个字节
for i in range(0, len(code_digit8), 8):
big_number = int(code_digit8[i:i+8], 8)
three_bytes = big_number.to_bytes(3, 'big')
three_bytes_seq_result.append(three_bytes)

file_content = b''.join(three_bytes_seq_result)

with open('E:\\脚本合集\\赛题脚本\\basectf\\basebase\\out.bin', 'wb') as f:
f.write(file_content)

运行得到

010查看bin文件

发现是png文件,改后缀查看

最后flag为BaseCTF{But_everyone_is_running_their_own_RACE_in_their_own_TIME}

Webshell

题目描述:

1
2
3
提交连接密码并用BaseCTF包裹提交

附件已更新, 解压密码 basectf, 解压后可能报毒

下载附件

ctfnat-A一把梭

解压压缩包丢到d盾扫描

定位到 phpStudy\WWW\www\wp-content\plugins\hello.php 文件

通过解读代码发现他是从一个url路径读取,十六进制解码得到路径 http://127.0.0.1/wp-content/themes/twentysixteen/js/ui.js

文件中发现base64字符串

base64解码后ROT13解码,得到密码

最后flag为BaseCTF{b7cdaf030d59ffed731dca01a1565eeb}


文章作者: yiqing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 yiqing !
  目录