-
-
[原创] 看雪 2025 KCTF 第十题 涅槃,亦是新生
-
发表于: 2025-9-4 02:41 3029
-
把一些字符串问AI,识别出这是 GHDL 编译后的二进制程序。
ubuntu上安装ghdl-gcc,让AI写一个VHDL程序给它编译(ghdl-gcc -a hello.vhdl,然后ghdl-gcc -e hello),得到的程序带有符号,可以与题目程序对比,标记出其中的库函数。
从ghdl_main函数向下找,与有符号的程序对比,标记处一个重要的函数:sub_140062E52是ghdl_process_register。
顺便再问问AI有关GHDL的一些原理,得知原始VHDL程序里所有的组合电路和逻辑运算都会编译为进程函数被ghdl_process_register注册,在这里只有sub_140057810和sub_140057A20两个,后者是主要逻辑所在。
(p.s.这其实是后面回顾的,如果比较熟悉GHDL应该能很快注意到,估计一血解题人是这样的。实际上自己做的时候,很长时间找不到主要逻辑在哪里,采用的方式是找输入(fgetc)和输出函数(fwrite)下断点,然后看调用栈找上级函数;同时对输入的字符下内存断点跟踪数据流然后在每个使用出继续看调用栈,最终发现都收敛到了sub_140057A20)
sub_140057A20的switch-case包含了获取输入、变换、运算、比较、输出。
经调试,其中case 5调用的sub_140044310是把输入的字符串取16个字节转成二进制,每个bit占一个字节,让02表示0,03表示1,得到一个128长度的数组。
结合AI分析,case 6、7、8调用了ghdl_process_wait_suspend(sub_14006340A)、ghdl_process_wait_timeout(sub_140063688)、ghdl_process_wait_timed_out(sub_1400633DE),这部分是时序同步,对应的信号在另一个process函数sub_140057810里处理。
(p.s. 其实是因为数据断点到这里会进到ghdl的库函数深处,没有办法继续跟踪了,才继续看这些函数)
sub_140057810里面的组合逻辑似乎只有根据某个值是1则赋值03是0则赋值02,而且调用的ghdl_process_wait_timeout(sub_140063688)的等待时间是外面的一半。
实际的信号直接的赋值关系应该在其他地方,这部分逻辑到最后也没看懂。
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!