一道逆向题的诞生
经历了长达20+小时的编写后,终于在本周结束前把题目给赶出来了……
这也是我人生中第一次出题。事实上,难度之大确实是超乎了我的想象,且听我慢慢谈谈我的心路历程。
题材?不落窠臼的困难
想出一道题,那么首先就得有考点。
原先,和社团里的小伙伴决定出一道diff方向的题目,想法是用户利用bindiff工具来找出代码中的不同。原先的计划是:同一个源文件,在几段代码或者文本处修改一下,让用户们找不同,但是做到一半发现,这样倒成为了bindiff专属题,简单是简单了,但好像和逆向也没多大关系了。于是便光速放弃了原计划,打算出一道和逆向有关联的题。
碰巧,最近就在研究非对称加密的有关知识,“为什么不设计一道RSA相关的题目?!”把密文藏代码里,让选手通过逆向获得;把私钥藏在修改的代码里,让选手利用bindiff工具来加快解题。我马上开始着手源代码的编写。
时间?项目管理的重要性:
很快我意识到,这样做会不会难度偏大?是的,我的目的是出一道新手也能做的逆向题,来让选手能从中学习bindiff这个工具的用法,但是,一旦把RSA这种非对称加密联系在一起,这对一个零基础的选手或许才更是挑战。
我便开始尝试优化代码结构,加各种小提示,来让选手意识到这段密文是被什么加密了,同时故意放出加密解密函数,希望他们能看懂这种加密方式是非对称的(当然,考虑的是那种还不懂的把代码结构丢给ai问出来这是哪种加密类型的人)。
而这样做的结果,当然是工期的无限增加,我需要考虑如何加一个tips才不会显得过于明显,也需要在代码逻辑上优化,不会让编译出来的可执行文件过于臃肿,原计划在周三晚上放出的题目,被延后到周四,而周四挤满的课表又只能让我在碎片时间里完成工作,同时还要兼顾每个函数的实现测试,确保不会出现各种bug……
直到周四十一十二点,我才初步将整个代码框架搭建完毕,而最终的编译与测试工作,还是得到周五完成了。
创新?过度想法的坏处:
直到题目完成前,我仍有蛮多的想法想添加在题目中,比如加一个反调试来防止选手动态搞出私钥,又或者添加一点动态编码,来让选手理解静态分析是不能解决所以问题的……对我来说,这些小trick对入门逆向或许“有帮助”,但从选手角度出发,一道入门题有着过多而且毫不相关的知识点无疑是一道令人恶心的题目(就我而言,深受其害),所以那个“这是一道简单题”的想法,成功阻止我过多杂糅题目。
当然有些想法还是被添加进去了,也是在题目上新之后,静下来自己带入选手做了一遍,才感觉这道题目并没有我想象得那么“有意思”,许多地方是为了出题而出,所以就现在的个人而言,这其实算是一道蛮失败的题目。
总结?任重道远的学习:
总结下来,这不算一道好题,也不算一次好的创作经历。要是有什么想说的,那就是个人水平还是远远不足的,至少还不足以作为一名老手去传授新手知识。
确实,相比起这些选手,我也不过是多学了半年。不过,其实这次题目的创作让我从另一个角度思考起逆向:任何题目,都是出题人专心挖好了一条能得解的道路,作为比赛选手,其实能做到只是挖出这条路。但是如果放在现实世界呢?在各种加密、混淆的代码面前,可不会留下某个做烂的知识点,程序庞大的架构,也远远不止一个RSA加密那么简单……逆向工程作为漏洞挖掘的必备技能,如果只会解解别人故意留下来的路,那或许成为不了真正的逆向工程师……
在这里留下你的足迹...