diff --git a/README.md b/README.md index d4d9b57..6a72056 100644 --- a/README.md +++ b/README.md @@ -10,39 +10,39 @@ ### 官方题解 -| 题目 write-up | 文件、源代码 | -| ------------------------------------------------------------ | ------------------------------------------------------ | -| [签到](official/签到/README.md) | [文件、源代码](official/签到/src) | -| [猫咪问答++](official/猫咪问答++/README.md) | [文件、源代码](official/猫咪问答++/src) | -| [2048](official/2048/README.md) | [文件、源代码](official/2048/src) | -| [一闪而过的 Flag](official/一闪而过的%20Flag/README.md) | [文件、源代码](official/一闪而过的%20Flag/src) | -| [从零开始的记账工具人](official/从零开始的记账工具人/README.md) | [文件、源代码](official/从零开始的记账工具人/src) | -| [超简单的世界模拟器](official/超简单的世界模拟器/README.md) | [文件、源代码](official/超简单的世界模拟器/src) | -| [从零开始的火星文生活](official/从零开始的火星文生活/README.md) | [文件、源代码](official/从零开始的火星文生活/src) | -| [自复读的复读机](official/自复读的复读机/README.md) | [文件、源代码](official/自复读的复读机/src) | -| [233 同学的字符串工具](official/233%20同学的字符串工具/README.md) | [文件、源代码](official/233%20同学的字符串工具/src) | -| [233 同学的 Docker](official/233%20同学的%20Docker/README.md) | [文件、源代码](official/233%20同学的%20Docker/src) | -| [从零开始的 HTTP 链接](official/从零开始的%20HTTP%20链接/README.md) | [文件、源代码](official/从零开始的%20HTTP%20链接/src) | -| [来自一教的图片](official/来自一教的图片/README.md) | [文件、源代码](official/来自一教的图片/src) | +| 题目 write-up | 文件、源代码 | +| ------------------------------------------------------------ | ------------------------------------------------------- | +| [签到](official/签到/README.md) | [文件、源代码](official/签到/src) | +| [猫咪问答++](official/猫咪问答++/README.md) | [文件、源代码](official/猫咪问答++/src) | +| [2048](official/2048/README.md) | [文件、源代码](official/2048/src) | +| [一闪而过的 Flag](official/一闪而过的%20Flag/README.md) | [文件、源代码](official/一闪而过的%20Flag/src) | +| [从零开始的记账工具人](official/从零开始的记账工具人/README.md) | [文件、源代码](official/从零开始的记账工具人/src) | +| [超简单的世界模拟器](official/超简单的世界模拟器/README.md) | [文件、源代码](official/超简单的世界模拟器/src) | +| [从零开始的火星文生活](official/从零开始的火星文生活/README.md) | [文件、源代码](official/从零开始的火星文生活/src) | +| [自复读的复读机](official/自复读的复读机/README.md) | [文件、源代码](official/自复读的复读机/src) | +| [233 同学的字符串工具](official/233%20同学的字符串工具/README.md) | [文件、源代码](official/233%20同学的字符串工具/src) | +| [233 同学的 Docker](official/233%20同学的%20Docker/README.md) | [文件、源代码](official/233%20同学的%20Docker/src) | +| [从零开始的 HTTP 链接](official/从零开始的%20HTTP%20链接/README.md) | [文件、源代码](official/从零开始的%20HTTP%20链接/src) | +| [来自一教的图片](official/来自一教的图片/README.md) | [文件、源代码](official/来自一教的图片) | | [超简陋的 OpenGL 小程序](official/超简陋的%20OpenGL%20小程序/README.md) | [文件、源代码](official/超简陋的%20OpenGL%20小程序/src) | -| [生活在博弈树上](official/生活在博弈树上/README.md) | [文件、源代码](official/生活在博弈树上/src) | -| [来自未来的信笺](official/来自未来的信笺/README.md) | [文件、源代码](official/来自未来的信笺/src) | -| [狗狗银行](official/狗狗银行/README.md) | [文件、源代码](official/狗狗银行/src) | -| [超基础的数理模拟器](official/超基础的数理模拟器/README.md) | [文件、源代码](official/超基础的数理模拟器/src) | -| [永不溢出的计算器](official/永不溢出的计算器/README.md) | [文件、源代码](official/永不溢出的计算器/src) | -| [普通的身份认证器](official/普通的身份认证器/README.md) | [文件、源代码](official/普通的身份认证器/src) | -| [超精巧的数字论证器](official/超精巧的数字论证器/README.md) | [文件、源代码](official/超精巧的数字论证器/src) | -| [超自动的开箱模拟器](official/超自动的开箱模拟器/README.md) | [文件、源代码](official/超自动的开箱模拟器/src) | -| [室友的加密硬盘](official/室友的加密硬盘/README.md) | [文件、源代码](official/室友的加密硬盘/src) | -| [超简易的网盘服务器](official/超简易的网盘服务器/README.md) | [文件、源代码](official/超简易的网盘服务器/src) | -| [超安全的代理服务器](official/超安全的代理服务器/README.md) | [文件、源代码](official/超安全的代理服务器/src) | -| [证验码](official/证验码/README.md) | [文件、源代码](official/证验码/src) | -| [动态链接库检查器](official/动态链接库检查器/README.md) | [文件、源代码](official/动态链接库检查器/src) | -| [超精准的宇宙射线模拟器](official/超精准的宇宙射线模拟器/README.md) | [文件、源代码](official/超精准的宇宙射线模拟器/src) | -| [超迷你的挖矿模拟器](official/超迷你的挖矿模拟器/README.md) | [文件、源代码](official/超迷你的挖矿模拟器/src) | -| [Flag 计算机](official/Flag%20计算机/README.md) | [文件、源代码](official/Flag%20计算机/src) | -| [中间人](official/中间人/README.md) | [文件、源代码](official/中间人/src) | -| [不经意传输](official/不经意传输/README.md) | [文件、源代码](official/不经意传输/src) | +| [生活在博弈树上](official/生活在博弈树上/README.md) | [文件、源代码](official/生活在博弈树上/src) | +| [来自未来的信笺](official/来自未来的信笺/README.md) | [文件、源代码](official/来自未来的信笺/src) | +| [狗狗银行](official/狗狗银行/README.md) | [文件、源代码](official/狗狗银行/src) | +| [超基础的数理模拟器](official/超基础的数理模拟器/README.md) | [文件、源代码](official/超基础的数理模拟器/src) | +| [永不溢出的计算器](official/永不溢出的计算器/README.md) | [文件、源代码](official/永不溢出的计算器/src) | +| [普通的身份认证器](official/普通的身份认证器/README.md) | [文件、源代码](official/普通的身份认证器/src) | +| [超精巧的数字论证器](official/超精巧的数字论证器/README.md) | [文件、源代码](official/超精巧的数字论证器/src) | +| [超自动的开箱模拟器](official/超自动的开箱模拟器/README.md) | [文件、源代码](official/超自动的开箱模拟器/src) | +| [室友的加密硬盘](official/室友的加密硬盘/README.md) | [文件、源代码](official/室友的加密硬盘) | +| [超简易的网盘服务器](official/超简易的网盘服务器/README.md) | [文件、源代码](official/超简易的网盘服务器/src) | +| [超安全的代理服务器](official/超安全的代理服务器/README.md) | [文件、源代码](official/超安全的代理服务器/src) | +| [证验码](official/证验码/README.md) | [文件、源代码](official/证验码/src) | +| [动态链接库检查器](official/动态链接库检查器/README.md) | [文件、源代码](official/动态链接库检查器/src) | +| [超精准的宇宙射线模拟器](official/超精准的宇宙射线模拟器/README.md) | [文件、源代码](official/超精准的宇宙射线模拟器/src) | +| [超迷你的挖矿模拟器](official/超迷你的挖矿模拟器/README.md) | [文件、源代码](official/超迷你的挖矿模拟器/src) | +| [Flag 计算机](official/Flag%20计算机/README.md) | [文件、源代码](official/Flag%20计算机/src) | +| [中间人](official/中间人/README.md) | [文件、源代码](official/中间人/src) | +| [不经意传输](official/不经意传输/README.md) | [文件、源代码](official/不经意传输/src) | ### 来自选手 diff --git a/official/一闪而过的 Flag/README.md b/official/一闪而过的 Flag/README.md index 8de7748..524ceb1 100644 --- a/official/一闪而过的 Flag/README.md +++ b/official/一闪而过的 Flag/README.md @@ -1,6 +1,8 @@ # 一闪而过的 Flag -这道题怎么做应该不用多说了,在开始菜单中查找 cmd 或者 powershell 并打开,再将 Untitled01.exe 拖进去,回车,结束。用过命令行就应该能做出来。其他 OS 用户可用虚拟机和 wine 。唯一的坑可能是录屏不能解,因为 Windows 10 默认 cmd 和 powershell 字体中 1 和大写 I 几乎完全相同无法区分。 +这道题怎么做应该不用多说了,在开始菜单中查找 cmd 或者 powershell 并打开,再将 Untitled01.exe 拖进去,回车,结束。 + +其他 OS 用户可用虚拟机和 wine 。唯一的坑可能是录屏不能解,因为 Windows 10 默认 cmd 和 powershell 字体中 1 和大写 I 几乎完全相同无法区分。 本题非常简单但确实来自于生活中我多次遇到的真实事件:想想多年以前,刚刚学 C 语言~~或是使用 Mathematica 注册机~~的时候,你是否也被这个问题困扰过呢? diff --git a/official/一闪而过的 Flag/src/Untitled01.c b/official/一闪而过的 Flag/src/Untitled01.c new file mode 100755 index 0000000..85c67b1 --- /dev/null +++ b/official/一闪而过的 Flag/src/Untitled01.c @@ -0,0 +1,79 @@ +#include +#include + +void usleep(__int64 usec) +{ + HANDLE timer; + LARGE_INTEGER ft; + + ft.QuadPart = -(10*usec); // Convert to 100 nanosecond interval, negative value indicates relative time + + timer = CreateWaitableTimer(NULL, TRUE, NULL); + SetWaitableTimer(timer, &ft, 0, NULL, NULL, 0); + WaitForSingleObject(timer, INFINITE); + CloseHandle(timer); +} + +int main() +{ + char flag[100]; + int n = 20; + flag[n++] = 'f'; + flag[n++] = 'l'; + flag[n++] = 'a'; + flag[n++] = 'g'; + flag[n++] = '{'; + flag[n++] = 'A'; + flag[n++] = 'r'; + flag[n++] = 'e'; + flag[n++] = '_'; + flag[n++] = 'y'; + flag[n++] = 'o'; + flag[n++] = 'u'; + flag[n++] = '_'; + flag[n++] = 'e'; + flag[n++] = 'y'; + flag[n++] = 'e'; + flag[n++] = 's'; + flag[n++] = '1'; + flag[n++] = 'g'; + flag[n++] = 'h'; + flag[n++] = 't'; + flag[n++] = '_'; + flag[n++] = 'g'; + flag[n++] = '0'; + flag[n++] = '0'; + flag[n++] = 'D'; + flag[n++] = '?'; + flag[n++] = '_'; + flag[n++] = 'c'; + flag[n++] = 'a'; + flag[n++] = 'n'; + flag[n++] = '_'; + flag[n++] = 'y'; + flag[n++] = 'o'; + flag[n++] = 'u'; + flag[n++] = '_'; + flag[n++] = 'd'; + flag[n++] = 'I'; + flag[n++] = 's'; + flag[n++] = 't'; + flag[n++] = '1'; + flag[n++] = 'n'; + flag[n++] = 'g'; + flag[n++] = 'u'; + flag[n++] = 'i'; + flag[n++] = 's'; + flag[n++] = 'h'; + flag[n++] = '_'; + flag[n++] = '1'; + flag[n++] = 'i'; + flag[n++] = 'I'; + flag[n++] = '?'; + flag[n++] = '}'; + flag[n++] = '\0'; + + printf("%s\n", flag + 20); + usleep(500000); + return 0; +} diff --git a/official/室友的加密硬盘/README.md b/official/室友的加密硬盘/README.md index 078bff3..f68ab8f 100644 --- a/official/室友的加密硬盘/README.md +++ b/official/室友的加密硬盘/README.md @@ -37,9 +37,9 @@ $ dd if=target.img of=swap.img bs=512 count=1497088 skip=393216 $ dd if=target.img of=chome.img bs=512 count=1998848 skip=1892352 ``` -用 file 查看一下并尝试 mount ,看出主分区是 ext4 格式的 boot 分区; 976M 分区 LUKS 加密,应该是题目中描述的家目录所在分区; swap 内有 SWSUSP1 镜像,表示有休眠存在;最后一个 6.1GB 分区只能是根分区了,因为虽然磁盘只得到了一小部分,分区表仍然是正常的。 +用 file 查看一下并尝试 mount ,看出主分区是 ext4 格式的 boot 分区; 976M 分区 LUKS 加密,应该是题目中描述的家目录所在分区; swap 内有 SWSUSP1 镜像,表示有休眠存在;最后一个 6.1GB 分区应该只能是根分区了。因为虽然磁盘只得到了一小部分,分区表仍然完整并会显示出所有的分区。 -那么之后自然的思路是看看 boot 内有没有东西,毕竟有些不太注意安全的人是会图方便把 LUKS 的key 放在 boot 中以便开机输入密码的。于是: +那么之后自然的思路是看看 boot 内有没有东西,毕竟有些不太注意安全的人是会图方便把 LUKS 的key 放在 boot 中以便开机不用输入密码的。于是: ``` $ sudo mount boot.img /mnt @@ -49,9 +49,9 @@ I'm not that stupid to put plaintext key in /boot! 信不信由你,我是信了。 -那怎么办呢? AES 又不能破解,那就只有 swap 和根分区有戏了。 +那怎么办呢? AES 又不能爆破,那就只有 swap 和根分区有戏了。 -根分区只有一点点,但也可以通过 testdisk 之类看看内容,或者 strings 一下... 要是有更多的非预期解那也算是 OK 了。 +根分区只有一点点,但也可以通过 testdisk 之类看看内容,或者 strings 一下... 要是有更多的非预期解那也算是 OK 的。 那就看 swap 吧,既然休眠,那估计整个内存 dump 都在里头了,那就找一下 AES key 吧 -- 这一步萌新出题人不太清楚做题的人能不能想到,出题灵感来源于 cold boot attack ,本想弄一个真实冷启动 dump 出的内存镜像,但鉴于能力和成本不够,就索性用休眠导致的 memory dump 了。 @@ -126,7 +126,7 @@ https://blog.appsecco.com/breaking-full-disk-encryption-from-a-memory-dump-5a868 https://access.redhat.com/solutions/1543373 ``` -注意,第一篇文章中一个有问题的地方是 LUKS 分区的大小和物理分区大小不同,所以用里面类似于 `echo "0 crypt aes-xts-plain64 0 4096" | sudo dmsetup create luks-volume` 的方法是不行的,并且其实具体的加密方式题目中也没有提到。你可以自己创建一个 LUKS 分区实验一下,对于题目,二者差了 4096 字节。而红帽文章中直接用 master key 添加 key slot 的方法不需要知道这些信息。但本人也不是专业人士,具体细节还要以正规渠道得到的信息为准。 +注意,第一篇文章中一个有问题的地方是 LUKS 分区的大小和物理分区大小不同(你可以自己创建一个 LUKS 分区实验一下,对于题目,二者差了 4096 字节),所以用里面类似于 `echo "0 crypt aes-xts-plain64 0 4096" | sudo dmsetup create luks-volume` 的方法是不行的,并且具体的加密方式题目中也没有提到。而红帽文章中直接用 master key 添加 key slot 的方法不需要知道这些信息。但本人也不是专业人士,具体细节还要以正规渠道得到的信息为准。 如果你能够搜到这两篇文章,尤其是第一篇(其实还是比较容易搜到的),那应该可以解出这个题了。 @@ -134,9 +134,9 @@ https://access.redhat.com/solutions/1543373 ### 一个非预期解 -不知是因为 LUKS 分区打开的时候本该如此,还是出题人操作不慎在分区创建的时候密码复制到了剪贴板上,密码本身明文在 swap 中出现了,所以 strings 一下然后逐个字符串尝试就可以求解。但感觉其实这样做出来也算是正常解法了。密码是什么就留作练习吧。 +不知是因为 LUKS 分区打开的时候本该如此,还是出题人操作不慎在分区创建的时候密码复制到了剪贴板上,密码本身明文在 swap 中出现了,所以 strings 一下然后逐个字符串尝试就可以求解。但感觉其实这样做出来也算是正常解法了。密码是什么留作练习。 ### 其他可能方法 -本题目的制作方法是在虚拟机装装上 xubuntu ,休眠之后 dump 出磁盘的一部分。就算不知道这个过程,一个自然的想法是尝试恢复启动,在 Linux 启动至 initrd 时进行分析(libreliu的思路)。 +本题目的制作方法是在虚拟机装装上 xubuntu ,休眠之后 dump 出磁盘的一部分。就算不知道这个过程,一个自然的想法是尝试恢复启动,在 Linux 启动至 initrd 时进行分析(libreliu的思路)。我没有试过,也留作练习。 diff --git a/official/来自一教的图片/README.md b/official/来自一教的图片/README.md index e7fb61a..ab801a3 100644 --- a/official/来自一教的图片/README.md +++ b/official/来自一教的图片/README.md @@ -26,11 +26,17 @@ plt.imshow(logf, 'gray') 题目中傅里叶光学是提示,文件名意思是 4F 成像系统中间,就对应物的傅里叶变换平面,也算是提示了,但或许对非物理专业的同学还是有点脑洞吧。 -相关模拟可以参考[ Matlab 官方文档](https://www.mathworks.com/help/matlab/math/two-dimensional-fft.html)。 +相关模拟可以参考[ Matlab 官方文档](https://www.mathworks.com/help/matlab/math/two-dimensional-fft.html)。本题的图片其实也是通过 Matlab 制作的。 为什么题目中说是模拟呢,因为题目中的图片取的是物傅里叶变换的实部,而一般实验能直接观测光强(用 CCD )和相位分布(用 [SH波前探测器](https://www.thorlabs.com/newgrouppage9.cfm?objectgroup_id=5287)),看电场实部或者虚部还真没听说过。 -这么做的原因是衍射光强分布不同地方差几个量级,如果这样存到图片里就损失了大量的信息。就算像本题这样取了实部,其实强度信息也基本损失完了,所以图片上除了黑点就是白点,几乎没有中间颜色。但因为实部包含了相位信息,所以仍能成功重构图像,因为[图像的细节信息其实在相位而不是强度中](https://people.eecs.berkeley.edu/~sastry/ee20/vision2/node6.html)。 +这么做的原因是衍射光强分布不同地方差几个量级,如果直接把光强存到图片里就损失了大量的信息,根本无法重构:你可以把圆孔衍射的光强分布存图片试一下,发现结果会肉眼可见地令人失望: + +![](pic/3.bmp) + +或许这方面图像处理有更好的方法,不过我不太懂。 + +就算像本题这样取了实部,其实强度信息也基本损失完了,所以图片上除了黑点就是白点,几乎没有中间颜色。但因为这种存储方式仍然包含了变换后图的相位信息,所以仍能成功重构图像,因为[图像的细节信息其实在相位而不是强度中](https://people.eecs.berkeley.edu/~sastry/ee20/vision2/node6.html)。 另外,真实情况的零频率分量是在成像中间的,模拟中其实需要进行 fftshift 操作,鉴于这里的图像根本区分不出中间还是边上,就也省去了。 diff --git a/official/来自一教的图片/pic/3.bmp b/official/来自一教的图片/pic/3.bmp new file mode 100644 index 0000000..8ba0d18 Binary files /dev/null and b/official/来自一教的图片/pic/3.bmp differ