【摘要】
正向检验算法还算直观,其唯一解的数学原理未知,但不妨碍我们直接爆破。
我们直接关注图1-1中代码,通过GetDlgItemTextA交叉索引得到。
通过基本分析,我们得到:
(1)Hi_this_obuf_icode_len__hex2bytes 将输入的32字节长lv_code通过16进制转换胃16字节,应该注意lv_code与转换后的Hi_codeLH的差异性,如
(2)转换后的16字节Hi_codeLH ,我们分为codeL,codeH高低(各8字节)两部分,其中抵8字节codeL填充了codeLSalt数组;
(3)Hi_last_check函数是核心检验函数。
图1-1 着手代码片段
如Hi_last_check的伪码和图1-2,代码框架分割为四部分。
(1)第一部分,检测codeLSalt的有效性,codeLSalt大小为0x100字节,如上所述,前8字节来自输入的codeL。
(2)第二部分,对codeLSalt进行变换;
(3)第三部分,利用codeLSalt和codeH对bsuk进行变换,bsuk初始值为codeLsalt前8字节;
(4)第四部分,变换后的bsuk是否为“GoodJob~”。
图1-2 Hi_last_check主要业务逻辑
针对核心算法操作的四个部分(忽略最后的strncmp,实际是三部分)进行爆破。
如图1-3,对codeLSalt的有效性检测,实际也分为四各小步骤,基本算法描述为:
图1-3 codeLSalt有效性
如图1-4,我们直到codeLSalt的大小为0x100,且初始末端的0x100-8字节都已经固定,通过观察,我们可以判定,其为0x00-0xFF的非重复排列,作为基准映射表使用。
由此出发,我们可以确定codeLSalt前8字节的取值集合,执行下述idapython
即codeL为[30, 40, 75, 109, 140, 163, 210, 251]的排列,有多少排列?
即codeL有40320种情形,我们以此为爆破入口,遍历所有情形,找到有效排列,通过下述pythn代码,我们将所有可能排列,顺序存放到pbs.bin文件中备用。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)