# 白与夜

- 题目分类:general

- 题目分值:100

这是一个关于白猫,嗯不对,关于黑猫的故事。

[打开/下载题目](./src/WhiteAndBlack.html)

---

这里是~~全场除签到题外最水的题的~~ writeup

![](./images/newcat.png)

~~先吸一口猫~~

## 解题方法

方法很多,你可以:

1. F12 然后发现
![](./images/F12.png)
这里的 `white` 也是提示之一,只要改成 `black` 即可显现出 flag。这样的操作对于通过了签到题的玩家应该没什么难度。
1. 下载图片并在黑色背景下查看。

## 图片生成

那么这张兼具黑白猫的图片是怎么生成的呢?

显而易见,在白色背景下看到的是白猫图,在黑色背景下看到的是黑猫图。能够产生这样的效果是因为在 PNG 文件中,每个像素都有 Alpha 通道值,在 0~1 之间(0 为完全透明,1 为不透明)。

设 A 为 Alpha 值,X 为图片像素点的灰度(0~1),则

白底时显示的灰度为:X<sub>1</sub> = A · X + (1 - A ) · 0

黑底时显示的灰度为:X<sub>2</sub> = A · X + (1 - A ) · 1

那么确定了 X<sub>1</sub> 和 X<sub>2</sub> 之后,可以解出 PNG 图片的 A 和 X:

A = 1 + X<sub>1</sub> - X<sub>2</sub>

X = X<sub>1</sub> / (1 + X<sub>1</sub> - X<sub>2</sub>)

其中若 1 + X<sub>1</sub> - X<sub>2</sub> = 0,也就是说 X<sub>1</sub> = 0,X<sub>2</sub> = 1,即白底显示白色,黑底显示黑色,此时 X 可取任意值,A 取 0。

为了让 A 取值在 0~1 之间,X<sub>1</sub> 需要小于 X<sub>2</sub>,这对选取的两张图片的灰度有要求,白底图应始终比黑底图亮。

刚刚讨论的是灰度图,但是很可惜 RGB 图片不能这样处理,因为 RGB 三个通道都可以这样算出一组 A 和 X。其中 A 不能保证相同,但 A 最终的取值只能有一个。

于是我准备了一张白猫图和一张黑猫图,其中黑猫图带有 flag。用 PhotoShop 将它们处理成**相同大小**的灰度图,然后运行 `run.py` 脚本生成新图。

![](./images/white.jpg)

![](./images/black.jpg)

~~做题不会使你快乐,但是吸猫会(逃~~