开发者生态
morning
HellGates,定制 CPU 门级挑战
摘要
Introduction # In the Summer of 2025 I published a crackme called HellGates . Then I published it in November on crackmes.one . Basically I designed a custom 32-bit CPU encrypted & bit addressable (no...
the
The
CPU
and
was
used
registers
record
bit
with
2026-09-20
1 阅读
约9分钟阅读
xutaxkamay
字号:
简介 # 2025年夏天,我发布了一个名为HellGates的crackme。然后我于 11 月份将其发布在 clangmes.one 上。基本上,我在 VHDL 中设计了一个加密和位可寻址(不可字节寻址)的自定义 32 位 CPU,将其综合为具有多层混淆、防篡改、时序检查和反调试的门级网表。它是为人类设计的,但显然对法学硕士也很有效,直到现在。一年了,没有人解决这个问题。不是人类,他们花了数周/数月的时间然后放弃了。不是法学硕士,Claude 失败了,ChatGPT 失败了,DeepSeek 在我给人们的提示指导下进行了数天或数周的工作后也失败了,最终模型宣布挑战“在可用资源的情况下计算不可行”。然后,2026 年 9 月,GPT-6 在 SRE-Bench 上用了不到 20-30 分钟就解决了这个问题。感谢张卓让这一切成为可能!简而言之:保护 CPU 状态的加密是惰性完成的并且非常弱; GPT-6 使用了侧通道/差分分析攻击,这使得在删除所有混淆层后可以非常轻松地重玩运行。它给出了所使用的加密的提示、解密的寄存器、重新加密的寄存器、正确运行网表并转储所有解密的 1GB (data.bin) 内存。挑战的详细信息在这里:虚拟CPU架构。我在虚拟CPU中使用的程序。我使用的主机端混淆。工具链。 CPU 架构 # 一般信息: # 该架构包含 16 个 32 位通用寄存器,以及一些特殊寄存器: typespecial_registers is record Overflow_flag : boolean ;条件标志:布尔值;程序计数器:cpu_地址_类型;键修饰符:特殊键修饰符类型; index_for_key_modifier : cpu_word_index_type; tea_pseudo_random_state : tea_integer_type;结束记录special_registers;类型registers_record是一般记录:register_array;特殊:特殊寄存器;结束记录 registers_record ; Overflow_flag 是指发生任何类型的整数溢出或除以零时。这些操作都是有符号整数操作,并且包含基本 ALU 操作。 (加、减、乘…)condition_flag 用于在不同位置之间进行分支。示例: IsEqual R2 , 0 // condition_flag=1 Branch @ loc ... 当condition_flag = 0 时的指令 ... loc: ... 当condition_flag = 1 时的指令 ... 现在您可能会问:什么是 key_modifiers/index_for_key_modifier ?我稍后将在下面解释内存架构。现在所有操作码: -- 整数运算 --constant opcode_type_or : opcode_type := "00001" ;常量 opcode_type_and : opcode_type := "00010" ;常量 opcode_type_not : opcode_type := "00011" ;常量 opcode_type_add : opcode_type := "00100" ;常量 opcode_type_substract : opcode_type := "00101" ;常量 opcode_type_division : opcode_type := "00110" ;常量 opcode_type_multiply : opcode_type := "00111" ;常量 opcode_type_sla : opcode_type := "01000" ;常量 opcode_type_sra : opcode_type := "01001" ;常量 opcode_type_sll : opcode_type := "01010" ;常量 opcode_type_srl : opcode_type := "01011" ;常量 opcode_type_rol : opcode_type := "01100" ;常量 opcode_type_ror : opcode_type := "01101" ; -- 内存操作 --constant opcode_type_read : opcode_type := "01110" ;常量 opcode_type_write : opcode_type := "01111" ; -- 分支操作 --constant opcode_type_is_bigger : opcode_type := "10000" ;常量 opcode_type_is_lower : opcode_type := "10001" ;常量 opcode_type_is_equal : opcode_type := "10010" ;常量 opcode_type_had_integer_overflow : opcode_type := "10011" ; -- 跳转、分支、设置 --constant opcode_type_jump : opcode_type := "10100" ;常量 opcode_type_branch : opcode_type := "10101" ;常量 opcode_type_set : opcode_type := "10110" ; -- 扩展指令 --constant opcode_type_xor : opcode_type := "10111" ;好吧,这里没有太多混淆,我可以使用链式指令加密,对操作码和微码引擎进行洗牌,但我当时认为这是矫枉过正。 (确实如此,但现在不确定)内存架构: # 当你正在做一个在加密内存上运行的CPU时,你需要小心,你不能简单地从内存中的任何位地址获取位,否则当你尝试读/写整数/指令时,你只会解密/加密垃圾,所以你的CPU变得毫无用处。这就是它与非加密内存的不同之处,因为您可以直接在任何位地址上读/写(理论上,大多数流行的 CPU 当然不会这样做)。它需要在对齐地址中读/写内存。在我的上下文中,一个词是 CPU 可以读/写到 RAM 中特定插槽索引的位数(并且只有这个数字)。在我的架构中,字大小为 64 位,正如您所猜测的,这就是我使用的加密方法的块大小。然而,与纯文本内存相比,这更难将代码写入其中,因为你不能简单地
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱