flag_in_a_flash, image_in_lab and roomates_disk update

This commit is contained in:
petergu
2020-11-05 17:57:55 +08:00
parent 1120d52483
commit 5888ed8bd8
6 changed files with 129 additions and 42 deletions
+3 -1
View File
@@ -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 注册机~~的时候,你是否也被这个问题困扰过呢?
+79
View File
@@ -0,0 +1,79 @@
#include <stdio.h>
#include <windows.h>
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;
}
+7 -7
View File
@@ -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 <size> crypt aes-xts-plain64 <key> 0 </dev/drive> 4096" | sudo dmsetup create luks-volume` 的方法是不行的,并且其实具体的加密方式题目中也没有提到。你可以自己创建一个 LUKS 分区实验一下,对于题目,二者差了 4096 字节。而红帽文章中直接用 master key 添加 key slot 的方法不需要知道这些信息。但本人也不是专业人士,具体细节还要以正规渠道得到的信息为准。
注意,第一篇文章中一个有问题的地方是 LUKS 分区的大小和物理分区大小不同(你可以自己创建一个 LUKS 分区实验一下,对于题目,二者差了 4096 字节),所以用里面类似于 `echo "0 <size> crypt aes-xts-plain64 <key> 0 </dev/drive> 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的思路)。我没有试过,也留作练习。
+8 -2
View File
@@ -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 操作,鉴于这里的图像根本区分不出中间还是边上,就也省去了。
Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB