betgame

题目描述:nc 112.125.25.81 9999

连接上是一个石头剪刀布的游戏,赢三十次才能得到flag。

you can input j or s or b. win me 30 times in 30 times! you will get the flag

j=剪刀、s=石头、b=布

#先做一个尝试摸索一下规律
#1.他声明出s
I will use: s
#我出s
s
#实际他出j,我出s胜利
oh you win

#2.他声明出j
I will use: j
#我出b
b
#实际他出s,我出b胜利
oh you win

#3.他声明出b
I will use: b
#我出b
b
#实际他出b,我出j胜利
peace and love

#4.他声明出s
I will use: s
#我出s
s
#实际他出s我出b胜利
peace and love

#5.他声明出s
I will use: s
#我出b
b
#实际他出s,我出b胜利
oh you win

#6.他声明出s
I will use: s
#我出s
s
#实际他出j,我出s胜利
oh you win

#7.他声明出s
I will use: s
#我出b
b
#实际他出b,我出j胜利
peace and love

#8.他声明出j
I will use: j
#我出s
s
#实际他出s,我出b胜利
peace and love

#9.他声明出b
I will use: b
#我出b
b
#实际他出j,我出s胜利
haha I win

#10,他声明出j
I will use: j
#我出s
s
#实际他出s,我出b胜利
peace and love

可能上面的文字描述会有错吧,这玩意真让人头大。

经过上面的尝试,我们可以发现一个规律就是

三次对局为一轮

第一局他会先出会输给自己声明的

比如第一轮出石头,他实际出的就是剪刀,此时你需要出石头(也就是跟他声明相同的)获得胜利。

第二局他会出会赢过自己声明的

比如第二轮出石头,他实际出的就是,此时你需要出剪刀(也就是会给他声明的)获得胜利。

第三局他会出跟自己声明相同的

比如第三局出剪刀,他实际出的就是剪刀,此时你需要出石头(也就是过他声明)获得胜利。

经历十轮就可以得到flag

贴上我的对局

xiafeng@LAPTOP:~$ nc 112.125.25.81 9999
you can input j or s or b. win me 30 times in 30 times! you will get the flagI will use: s
s
oh you win
I will use: j
b
oh you win
I will use: b
j
oh you win
I will use: b
b
oh you win
I will use: s
j
oh you win
I will use: j
s
oh you win
I will use: b
b
oh you win
I will use: b
s
oh you win
I will use: j
s
oh you win
I will use: j
j
oh you win
I will use: b
s
oh you win
I will use: b
j
oh you win
I will use: j
j
oh you win
I will use: s
j
oh you win
I will use: j
s
oh you win
I will use: s
s
oh you win
I will use: j
b
oh you win
I will use: s
b
oh you win
I will use: b
b
oh you win
I will use: s
j
oh you win
I will use: b
j
oh you win
I will use: j
j
oh you win
I will use: j
b
oh you win
I will use: s
b
oh you win
I will use: b
b
oh you win
I will use: j
b
oh you win
I will use: j
s
oh you win
I will use: s
s
oh you win
I will use: b
s
oh you win
I will use: s
b
oh you win
bytectf{bet_4_f4n_3828fhh}

1-2

相当有意思的一道题

jigsaw

拼图,到手附件,231张图

1-1

因式分解231

2-1

正常图片的话应该就比例比较接近,所以猜测是21x11的长方形

再思考思路

先想的是把有字的图片取出来直接拼,拼了半天零零碎碎是拼出来几个字母,但是差距挺大的,之后的就拼不出来了。

再想,图片的切割和生成肯定是按着一定的时间顺序,因为一定是工具切割不是手动切割的,所以我们在文件夹内选择按照时间排序。

3-1

可以明显看到图片的顺序比较规律了,那么我们尝试手动拼接。

小技巧是用PPT可以高效的拼接图片

一行21(3x7)张,一列11

完成效果

4-1

提交flag需要注意官方格式

#本次比赛所有的flag提交格式均为bytectf{.+}!!!
bytectf{fate_stay_nt}

后面觉得生成的图片不太完美,使用脚本可以完美生成

#-*- coding:utf-8 -*-
import PIL.Image as Image
import os
 
IMAGES_PATH = 'D:\\Desktop\\pics\\'  # 图片集地址
IMAGES_FORMAT = ['.jpg', '.JPG']  # 图片格式
IMAGE_SIZE = 256  # 每张小图片的大小
IMAGE_ROW = 11  # 图片间隔,也就是合并成一张图后,一共有几行
IMAGE_COLUMN = 21  # 图片间隔,也就是合并成一张图后,一共有几列
IMAGE_SAVE_PATH = 'D:\\Desktop\\final.jpg'  # 图片转换后的地址
 
# 获取图片集地址下的所有图片名称

image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if
               os.path.splitext(name)[1] == item]

def sort_file_by_time(file_path):
    files = os.listdir(file_path)
    if not files:
        return
    else:
        files = sorted(files, key=lambda x: os.path.getmtime(os.path.join(file_path, x)))#格式解释:对files进行排序.x是files的元素,:后面的是排序的依据.   x只是文件名,所以要带上join.
        return files
image_names = sort_file_by_time(IMAGES_PATH)
print(image_names)


# 简单的对于参数的设定和实际图片集的大小进行数量判断
if len(image_names) < IMAGE_ROW * IMAGE_COLUMN:
    raise ValueError("合成图片的参数和要求的数量不能匹配!")

# 定义图像拼接函数
def image_compose():
    to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_SIZE, IMAGE_ROW * IMAGE_SIZE)) #创建一个新图
    # 循环遍历,把每张图片按顺序粘贴到对应位置上
    for y in range(1, IMAGE_ROW + 1):
        for x in range(1, IMAGE_COLUMN + 1):
            from_image = Image.open(IMAGES_PATH + image_names[IMAGE_COLUMN * (y - 1) + x - 1]).resize(
                (IMAGE_SIZE, IMAGE_SIZE),Image.ANTIALIAS)
            to_image.paste(from_image, ((x - 1) * IMAGE_SIZE, (y - 1) * IMAGE_SIZE))
    return to_image.save(IMAGE_SAVE_PATH) # 保存新图
image_compose() #调用函数

得到图片,完美
5-2

据说使用工具Jigsaw-Solver也是可以的,没有尝试。

参考文章:
Python将多张图片进行合并拼接

biswajitsc/jigsaw-solver
A jigsaw puzzle solver for randomly shuffled square shaped images. - biswajitsc/jigsaw-solver