From 5888ed8bd8548a492b83730134c15a52cf1aa1e5 Mon Sep 17 00:00:00 2001 From: petergu Date: Thu, 5 Nov 2020 17:57:55 +0800 Subject: [PATCH] flag_in_a_flash, image_in_lab and roomates_disk update --- README.md | 64 +++++++++--------- official/一闪而过的 Flag/README.md | 4 +- official/一闪而过的 Flag/src/Untitled01.c | 79 ++++++++++++++++++++++ official/室友的加密硬盘/README.md | 14 ++-- official/来自一教的图片/README.md | 10 ++- official/来自一教的图片/pic/3.bmp | Bin 0 -> 361078 bytes 6 files changed, 129 insertions(+), 42 deletions(-) create mode 100755 official/一闪而过的 Flag/src/Untitled01.c create mode 100644 official/来自一教的图片/pic/3.bmp 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 0000000000000000000000000000000000000000..8ba0d18b6a9bd209c9583fb42a38557f5674cfe1 GIT binary patch literal 361078 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 b!~qWl!l$Q))zyaQZFSljle1eOFg^bVG5ol^ literal 0 HcmV?d00001