DUTCTF2024 - 输入flag以获取flag

这个题赛时惨遭爆0,完赛之后我去拷打了一下出题人,出题人表示这个题简单得一批你自己憋去WP不放了。在复盘这道题之后,我发现这题纯属RE签到题,那为什么没做出来呢,因为我既不懂 Electron 也不懂 Node.js ,压根没见过这种题,思路也跑偏了,甚至歪到了IDM之类软件的联网认证,但其实这个题很朴实无华,如果了解 Node.js 那么问题就不大。

这道题有两个付费 hint ,100分的那个没啥用,600分的很有用。600分那篇文章来自于吾爱破解论坛的精华帖子,原文在Xmind macOS & Windows (23.09.xxxxx) 通杀方案,帖子里这部分比较关键: 在这段文字上方,原帖楼主通过添加代码获取了程序原有的部分信息,然后调用了原函数使程序继续正常运行(我不懂js反正看着是这么回事)。

Windows 下的 Electron 程序由于有 bytenode 的存在,不能直接逆向看源码或者伪代码,只能通过上述类似的方式获得片段的信息,不过对这道题也足够了。

回头看题目本身。直接快进到解压 app.asar , app 文件夹里东西比较混乱,前后端跟混一起了一样。

其中这三个文件是前端的, index.html 没啥好说的,就是程序主界面。 md5.js 也就是个标准的加密函数,没涉及到异或换表凯撒啥的,非常健康。

package.json 长这样:

那就看看 program.js :

看到了喜闻乐见的 .jsc 。盲猜这个题的逻辑是,先在前端输入 flag ,然后进行 md5 加密;后端的 main.js 里应该存放着密文或者明文进行加密后,和前端的密文进行对比。

根据上文帖子的提示,可以尝试从 program.js 下手,对 main.js 进行 hook ,看看能不能搞到有用的东西。

拷打 GPT 和其他师傅得知,node.js 原生自带加密的 api , crypto 模块里的 update 方法用于向 md5 对象中输入内容,如果后端是把明文加密之后再作对比,那么直接 hook 这个update 方法就能直接得到 flag 明文。先修改 program.js 试试看: 这样一来,就可以在终端里捕获到后端被加密的明文。

修改完后重新打包为 app.asar ,这里如果直接electron app.asar的话会报错,因为 electron 环境版本可能不同。把 app.asar 放回原来的位置,然后打开 cmd 直接运行 获取FLAG.exe ,随便输入点内容然后点按钮,终端直接输出了捕获到的 flag , 代入检查正确:

相比于常规的 IDA 手撕套娃加密混淆算法的题目,这种令人耳目一新的题确实没见过,以后还得多加练习。