# Misc

观察 AI 代码,

1
2
3
4
5
6
def random_ai(palyerinputs):
seed = palyerinputs[:-1]
if len(seed) == 0:
return random.randint(1, 3)
else:
return (most_common_element(seed) - 2) % 3 + 1

可知当玩家第一次出拳时,AI 随机选择出拳;此后,AI 总选择玩家使用最多的出拳方式的下一个出拳。

这样就很简单,可以写一份代码,选择 AI 出拳方式的前一个即可。考虑可能 AI 出拳三个中的第一个,所以将 - 2 改为 + 1 就能解决问题。

生成代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
a=[1,2,3]
b=[1,0,0]
d={0:'Rock',1:"Paper",2:"Scissors"}
f=0
print(d[f])
j=0;
while(j<100):
j+=1
mx=0
ind=0
for i in range(0,3):
if(b[i]>mx):
ind=i
mx=b[i]
f=(ind + 1) % 3;
b[f]+=1
print(d[f])

可生成首次出拳为 Rock 的必胜出法。

img

输入靶机时,由于 AI 第一次出拳随机,所以需要多操作几次,直到第一次输入 Rock 显示玩家赢,将后续必胜方法复制输入即可拿到 flag。

img

即 flag 为 XYCTF

# game

img

# 我的二维码为什么扫不出来

题目附件给出了一个被混淆的二维码和一个加密程序。

img

图片中二维码由 25 行 * 25 列构成,每一格为一个像素。

混淆程序的操作为,随机选取七次,选中的行或列进行反色处理(即白格变黑格,黑格变白格)

依照二维码的基本特征(三个定位框), 可以直接找出四个被反色处理的行和列。分别为一、三、六列和第二行。经过处理,发现仍然无法扫码。说明剩余三行随机在二维码的某行某列进行反色。三行较少,可以直接爆破处理。

在 python 导入 pyzbar 的二维码扫描组件,在穷举爆破时辅助扫描,最终发掘出 flag。

flag{qR_c0d3_1s_s0_fun}

恢复的二维码:

img

img

对应 python 程序(主函数,重复部分省略)

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
reverse_col_colors(pixels, (height//10-1)*1//25, height)
reverse_col_colors(pixels, (height//10-1)*3//25, height)
reverse_col_colors(pixels, (height//10-1)*6//25, height)
reverse_row_colors(pixels, (width // 10 - 1)*2//25, width)
new_img.save("flag.png")
import cv2
import random
a = list(range(10, 17))
b = list(range(10, 17))
cl = [(x, y, z) for x in a for y in a for z in a if x != y and y!=z and x!=z]
k=cl[0]
print(k)
from pyzbar.pyzbar import decode
from PIL import Image
for i in range(1,len(cl)):
original_img = Image.open("flag.png")
new_img = original_img.copy()
width, height = new_img.size
pixels = new_img.load()
reverse_col_colors(pixels, (height//10-1)*cl[i][0]//25, height)
reverse_col_colors(pixels, (width//10-1)*cl[i][1]//25, width)
reverse_col_colors(pixels, (width//10-1)*cl[i][2]//25, width)
k=cl[i]
new_img.save("flags.png")
new_img.save("flags.png")
image = Image.open('flags.png')
#new_img.save("flags"+str(random.randint(1,10000))+".png")
decoded_objects = decode(image)
try:
for obj in decoded_objects:
print(obj.data.decode('utf-8'))
new_img.save("flags"+str(random.randint(1,10000))+".png")
except:
pass
#后面重复,省略

# Osint1

# Osint2

信息:洛阳龙门 - 泸州(15:10 发车)

img

img

然后附近知名景点一个一个试

# ez_隐写

第一层伪加密

第二层口令爆破

img

第三层盲水印得 flag

img

# 熊博士

img

# ZIP 神之套

IDA 打开得到提示

img

掩码爆破压缩包

img

明文爆破

img

md 文件里发现 flag

img

# 出题有点烦

字典爆破

img

对最后一张图片进行 foremost 发现一个压缩包,进行暴力破解

img

img

# zzl 的护理小课堂

开启靶机,进入答题界面

# 方法 1

答题即可,超过 100 分拿 flag。

# 方法 2

观察源码,发现这一段 js:

img

在控制台输入即可。

img

# 方法 3

注意到 flag.php,直接访问被拦截:

img

推测为 Referer 验证,用 ModHeader 添加即可。

img

img

# 真 > 签到

文件头

img

# 彩蛋?

img

第一个 ASCII 码

img

第二个

img

第三个封面 lsb 隐写

img

Dvorak 键盘解码

img

# 签到

# EZ_Base1024*2

由题意可知为 base2048 编码,使用工具解密即可。

img

# 美妙的歌声

AU 打开获得 key

img

deepsound 解密

img

得到 flag

img

# Ez_osint

# 疯狂大杂烩!九转功成

1

img

宽高

img

flag1:XYCTF{T3e_c0mb1nation_

2

img

img

flag2:0f_crypt0_and_

3

img

flag3:misc_1s_re6lly_fun!!

4

img

微信聊天数据库解密

img

flag4:L1u_and_K1cky_Mu

5

img

文本隐写 + serpent 解密

flag5:_3re_so_sm4rt!

6

按键盘布局画字母

img

steghide 密码:文件名排列一下

img

flag6:In_just_a_few_m1nutes_

7

维吉尼亚 keyA-Z

img

将 m 改为 d

img

flag7:they_were_thr0ugh!

8

<img src="http://img.miaoaixuan.cn/1712160790804-4671b4a1-bd17-4c6b-a7d1-e7ffc1dc5ee1.png" alt="img" style="zoom:50%;" />

flag8: Sm3rt_y0u_can_do

9

oursecret 解密

flag9: _nine_turns?}

1
XYCTF{T3e_c0mb1nation_0f_crypt0_and_misc_1s_re6lly_fun!!L1u_and_K1cky_Mu_3re_so_sm4rt!In_just_a_few_m1nutes_they_were_thr0ugh!Sm3rt_y0u_can_do_nine_turns?}

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

泠鹇 微信支付

微信支付

泠鹇 支付宝

支付宝

泠鹇 贝宝

贝宝