-
-
[原创]KCTF2020第三题 重返地球 设计思路:racket逆向
-
发表于: 2020-10-21 23:35 4431
-
最近刚好学习了racket这门语言,发现挺有意思的,尤其是通过Continuation Passing Style可以把racket程序转换成C。而且把racket程序CPS之后的可读性变得更差了,而函数式编程语言的逆向相对而言也非常少,于是便有了这道题目。函数式编程向来都以奇异为特点(相对于中规中矩的C/Java/Python),于是最适合的题目名称我认为是《异常信号》。
程序的逻辑很简单,就是一个标准的有限域的矩阵相乘。因为这道题目重点在于逆向racket而不在于算法,所以没有选择复杂的算法。racket源代码是chall.rkt
。因为是一步一步从普通racket程序改的,所以我把每个步骤都commit了一次,详情可以看git log。Python文件用于生成数据,即用来相乘的矩阵,output.txt
是从Python生成的输出数据。parenthec.rkt
和pc2c.rkt
是转换所需要用到的工具,详情见论文:parenthec。因为生成的C源码存在一些需要自己定义的函数,比如说获取输入数据(不然会链接错误),所以modify.c
实现了这些函数,用于直接复制到chall.c
中。
因为程序是registerization过的,所以所有的racket函数的参数都由全局变量传递。而这些regster可以是一个结构体的指针,也可以是一个int整形。分析程序逻辑的关键点在于识别出continuation的结构体,以及其中的union结构,这样才能在apply-k
的switch
中分析原本的递归逻辑。详细的分析以后有空再写吧。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2020-11-22 12:36
被kanxue编辑
,原因:
赞赏
他的文章
看原图
赞赏
雪币:
留言: