首页
社区
课程
招聘
[原创]KCTF-第六题 秘辛揭露 设计思路
发表于: 2025-8-10 12:05 2409

[原创]KCTF-第六题 秘辛揭露 设计思路

2025-8-10 12:05
2409

天龙八部之KCTF

乔峰,你好大的胆子!胆敢谋害少林寺方丈?!为救阿朱,在你面前的有俩条路,一是打服所有人,二是自尽。

阅读E-Debug源码,发现如 1所示代码,功能为检测是否为易语言静态编译程序,将程序当中的相应特征抹掉即可完成Anti E-Debug

duint eMagicHead = Script::Pattern::FindMem(codeBase, codeSize, "50 64 89 25 00 00 00 00 81 EC AC 01 00 00 53 56 57");

 

if (ReadUInt(lpFirstLibAddr) == 0x1312D65) {

// ->检测到易语言静态编译程序

}

1

其中 "50 64 89 25 00 00 00 00 81 EC AC 01 00 00 53 56 57"特征码取自函数“krnln_?LibInitUserProgram@CKrnlApp”,溯源流程如 1所示。关于符号哪里来,写在附录OBJ(编译中间文件)

 

1

另一特征码0x1312D65”(652D3101)取自libinfo0,该字段归属于libinfos,如 2所示。此外,还有lib0_guidlib0_name字段可用于检测其是否为易语言程序。

 

2

在抹掉相应的特征后,可能会出现强制解析绕过反调试的情况。对此,通过重载易语言的内核(核心支持库部分),达到E-Debug失效的目的。同时,也可借此机会,进一步扩大防守空间。

重载流程如 3所示,先尝试还原krnln_static.lib相关函数,复现一份后使用llvm-cl生成e_plug_overload_lib.lib文件。随即篡改obj文件,抹掉原函数特征并跳转到e_plug_overload_lib所对应的重载函数。最后通过修改link的参数链接e_plug_overload_lib达到重载易语言内核的目的。

 

3

编写一段测试代码,基于COFFI库完成,代码内容如 4所示。功能是HOOKOBJ文件的ecode函数。程序编译结果如 5所示,可以看到ecode直接跳转到了“_krnle_test_test_test”函数。程序运行结果如 6所示,可以看到是一段具有llvm特征的代码。

 

4

 

5

 

6

接下来列出本次赛题所重载的函数及对应关系。

符号

重载后的符号

_krnln_fnXOR

_bit_xor_operate

_krnln_fnSHL

_bit_shl

_krnln_fnRnd

_m_krnln_fnRnd

_krnln_fnSHR

_m_krnln_fnSHR

_krnln_fnLen

_m_krnln_fnLen

_krnln_fnBinLen

_m_krnln_fnBinLen

_krnln_fnMod

_m_krnln_fnMod

_krnln_fnBAnd

_m_krnln_fnBAnd

2

编写编译时混淆首先需要先解析语法树,解析过程参考易语言编译器逆向一文中的前缀表达式。1000行左右的代码即可解析易语言的大多数控制流。解析效果如 7所示,由于笔者时间不够了,哈哈,所以没实现。

 

7

Crypto

.版本 2

 

' 计算flag字节和

 

sum 0

 

.计次循环首 (32, i)

    sum sum flag [i]

.计次循环尾 ()

 

' 计算随机偏移(简化FS寄存器读取为0

rand_offset box_size sum (1024 2 × box_size)

g_rand_offset rand_offset

 

' 用随机数填充buf

.计次循环首 (1024, i)

    buf [i] = 取随机数 (0, 255)

.计次循环尾 ()

 

' 初始化vec_ord [0-255]

.计次循环首 (256, i)

    vec_ord [i] i 1

.计次循环尾 ()

 

' Fisher-Yates洗牌算法

.计次循环首 (256, i)

    j_idx = 取随机数 (1, i)

    temp vec_ord [i]

 

    vec_ord [i] vec_ord [j_idx]

    vec_ord [j_idx] temp

.计次循环尾 ()

 

' 初始化pbox_arr

.计次循环首 (256, i)

    pbox_arr [vec_ord [i] 1] 255 vec_ord [i]

.计次循环尾 ()

 

' 2025轮置换

p 0

.计次循环首 (2025, round)

    .计次循环首 (256, i)

        p (p pbox_arr [i] round 1 key [(i 1) key_size 1]) 256

        .如果真 (p 1 i)  ' 跳过交换

            到循环尾 ()

        .如果真结束

        ' 交换 pbox_arr[i] pbox_arr[p+1]

        temp pbox_arr [i]

        pbox_arr [i] pbox_arr [p 1]

        pbox_arr [p 1] temp

    .计次循环尾 ()

.计次循环尾 ()

 

' pbox_arr保存到buf的随机偏移位置

.计次循环首 (256, i)

    buf [g_rand_offset i] pbox_arr [i]

.计次循环尾 ()

 

' 复制输入到输出

.计次循环首 (32, i)

    output_arr [i] input [i]

.计次循环尾 ()

 

' DWORD异或操作(4字节一组)

.计次循环首 (8, i)  ' 32/4=8

    value 0

    .计次循环首 (4, j)

        k (i 1) × 4 j

        value value + 左移 (output_arr [k], (j 1) × 8)

    .计次循环尾 ()

    key_byte key [(i 1) 8 1]

    value = 位异或 (value, key_byte)

    ' 分解DWORD回字节

    .计次循环首 (4, j)

        k (i 1) × 4 j

        output_arr [k] = 位与 (右移 (value, (j 1) × 8), 255)

    .计次循环尾 ()

.计次循环尾 ()

 

' 114514次混淆操作

.计次循环首 (114514, i)

    .计次循环首 (32, j)

        .如果 (j 2 1)  ' 奇数索引(易语言索引从1开始)

            .如果 (j 1)

                output_arr [j] = 位异或 (output_arr [j], output_arr [j 1])

            .否则

                ' 索引1无前一个字节,跳过

            .如果结束

 

        .否则

            output_arr [j] buf [g_rand_offset output_arr [j] 1]

        .如果结束

 

    .计次循环尾 ()

.计次循环尾 ()

 

' 转换回字节集

.计次循环首 (32, i)

    output [i] output_arr [i]

.计次循环尾 ()

 

返回 (到字节集 (output))

 

3

DeCrypto

.版本 2

 

' buf加载pbox

.计次循环首 (256, i)

    pbox_arr [i] buf [g_rand_offset i]

.计次循环尾 ()

 

' 构建逆pbox映射

.计次循环首 (256, i)

    inv_pbox [pbox_arr [i] 1] i 1

.计次循环尾 ()


传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2025-8-27 12:08 被kanxue编辑 ,原因:
上传的附件:
收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 1568
活跃值: (2026)
能力值: ( LV12,RANK:229 )
在线值:
发帖
回帖
粉丝
2

奇怪,zip上传失败了。

    目录: D:\work\source\repos\e_plug


Mode                 LastWriteTime         Length Name                                    Function
----                 -------------         ------ ----
d-----         2025/8/10     12:14                e_plug_client                                  HOOK 易语言拿到语法树
d-----         2025/8/10     12:15                e_plug_obj_hacker                         操作 krnln 和 crackme.obj
d-----         2025/8/10     12:15                e_plug_overload_lib                       重载 krnln 的 lib
d-----         2025/8/10     12:15                e_plug_overload_lib_test               重载 krnln 的 lib_unit_test
d-----         2025/7/25     21:16                e_plug_server                                 用于和 Client 交互    
d-----          2025/8/9     10:39                e_plug_server_parsing                     用于解析语法树并做混淆


  这是测试样本,压缩包的大小有些大,包含了krnln相关的 obj、crackme 相关的 obj,解包 LIB、打包LIB脚本等内容。

通过网盘分享的文件:KCTF-天龙八部.zip等2个文件
链接: 778K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3j5h3&6Q4x3X3g2T1j5h3W2V1N6g2)9J5k6h3y4G2L8g2)9J5c8Y4y4Q4x3V1j5I4y4p5c8w2N6K6c8s2d9g2g2K9P5r3S2B7d9X3&6G2i4K6g2X3N6o6g2f1L8K6u0c8 提取码: aepm 

最后于 2025-8-10 13:14 被zZhouQing编辑 ,原因:
上传的附件:
2025-8-10 12:19
0
雪    币: 73668
活跃值: (23046)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3



参赛 CrackMe 必须可以在 WIN11/64、WIN11/32、WIN10/32、WIN10/64 、WIN7/32、WIN7/64、WINXP其中一种系统正确运行。 

windows7上测试没通过,输入正确的flag,会异常。 windows10上没问题。
也符合规则的,但要强调一下平台。

2025-8-10 14:50
0
雪    币: 1568
活跃值: (2026)
能力值: ( LV12,RANK:229 )
在线值:
发帖
回帖
粉丝
4
kanxue 参赛 CrackMe 必须可以在 WIN11/64、WIN11/32、WIN10/32、WIN10/64 、WIN7/32、WIN7/64、WINXP其中一种系统正确运行。 wind ...
修改好描述附件了。
2025-8-10 16:01
0
雪    币: 1568
活跃值: (2026)
能力值: ( LV12,RANK:229 )
在线值:
发帖
回帖
粉丝
5
kanxue 参赛 CrackMe 必须可以在 WIN11/64、WIN11/32、WIN10/32、WIN10/64 、WIN7/32、WIN7/64、WINXP其中一种系统正确运行。 wind ...
申请将题目更为新的附件:天龙八部之crackme_2.exe
原因:link 命令操作的 obj 错了,得重写 wp。
2025-8-14 12:01
0
雪    币: 73668
活跃值: (23046)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
6
收到
2025-8-14 13:33
0
游客
登录 | 注册 方可回帖
返回