LCTF 2017 未解之谜:BeRealDriver && YublKey Writeup

Posted by Pwnhub on 2017-11-21

作者:L-Team

BeRealDriver

本题有一个指向 Wikipedia LDW 页面的 Hint ,是因为题目设计之初是想模仿现代汽车上常用的 LDW 系统。题目文件中含有两张图片,分别对应着 LDW 输入的地图,和驾驶员采取的驾驶路径。程序中的 LDW 首先判断驾驶路径是否在地图许可的范围内,如果不在,就报警;接下来另一个模块会检查驾驶路径是否经过了预设的几个危险点,如果没有经过,认为攻击失败。满足以上所有条件,即可得到 flag 。参赛者需要在分析以上程序逻辑的基础上提供两个文件,这两个文件(同样是图片)和上文中提到的两张内置图片分别异或后,作为被攻击者影响之后的地图和驾驶员操作,提供给上述的判断逻辑。

由此,一个简单的攻击思路是,提取出程序内置的两张图片之后,用 Photoshop 的自由变形功能,扭曲两张图片,使其经过指定位置,之后将新图片和原图片分别异或,并提交结果,即可得到正确解答。

这个题主要的坑点应该是 OpenCV 。很多人反馈跑不起来,这个和库版本有关系,我用的是最新版的库。另外还有人被 Windows 10 的图片查看器坑了,唉,临门一脚……所以劝大家多用 Linux ,你看 Linux 下连个像样的好看的图片查看器都没有(除了Chromium),自然不会发生这种问题。此外另一个坑点是由于我写的算法鲁棒性太差,如果输入数据的连续性不够就会 segfault ……

题目设计之初本来是想按照真正的 LDW 工作,由三个线程构成,一个负责输出摄像头和操作数据,一个负责做 LDW ,另一个负责做危险点检测,且把核心逻辑放到 CUDA 中。但由于自己码力不太够,只能采取目前这种伪 LDW 设计,希望大家还是玩的开心。

题目源代码已经在 https://github.com/SilverBut/LCTF2017_BeRealDriver 公开,上述的两张图片可在 LCTF2017_BeRealDriver/code/examples 中找到,题目设计思路文档可在 LCTF2017_BeRealDriver/doc 中找到。

YublKey

本题是临时起意想到的。GH60 是一款开源键盘,大多数情况下其使用的固件是tmk_keyboard。本题设计是,在烧入此固件后按下特定按钮,即通过print函数输出 flag ,这个输出操作是通过使用固件自带的钩子点hook_matrix_change实现的,所以如果能找到源码并阅读一下,或者是自行编译后做 bindiff ,就可以发现这个 hook 点被改动过,直接分析相关代码即可。

这个题首要难题就是怎么知道这是个 GH60 的固件,实际通过字符串就能看到 GH60(从一个老司机那里学到的这一招,strings -e l ./YublKey-stripped-elf),搜一下就有一些思路了,当然还是有点小脑洞。另外一点就是IDA对部分MCU的支持不太好,不过对 GH60 使用的MCU来说应该还是没什么大问题的。放出elf文件之后,加载和函数识别实际就没有什么问题了,题目难度下降了一档,但是仍然没有人做,可能是大家已经对我失去信心了吧233……

同上题一样,这个题的设计和实现也有一些差距……原意是在固件中植入一个键盘记录器,输入 flag 字符串后将内存中的记录信息输出,选手需要逆向程序逻辑来得到flag。但由于编码时间不够,就选择了现在这种比较挫的设计思路。

题目源代码同样也在github上开源了,地址为 https://github.com/SilverBut/LCTF2017_YublKey 公开。我是 clone 后直接修改的,所以可以看一下最近的几次提交记录。