首页
论坛
课程
招聘
[原创][2020][KCTF]第三题 寻踪觅源 wp
2020-4-18 14:27 2396

[原创][2020][KCTF]第三题 寻踪觅源 wp

ccfer 活跃值
16
2020-4-18 14:27
2396
首先ida看一下,很多符号都在,看得出是个quickjs引擎,下载一套源码,辅助分析对比
然后对感兴趣的函数都下了断点,输入name和sn,筛选掉一批没价值的断点

最后定位到一个很关键的函数,基本上只要这一个断点就能把所有数值关系推算出来:
.text:00437300 _js_binary_arith_bigint_lto_priv_300

参考一下源码函数定义:
static int js_binary_arith_bigint(JSContext *ctx, OPCodeEnum op, JSValue *pres, JSValue op1, JSValue op2)

op = 0x9C 是乘法:
.text:00437630 loc_437630:
.text:00437630                 mov     ecx, [esp+9Ch+var_7C] ; jumptable 004373B1 case 156
.text:00437634                 mov     edx, [esp+9Ch+var_80]
.text:00437638                 mov     eax, [esp+9Ch+var_74]
.text:0043763C                 mov     [esp+9Ch+var_98], 1
.text:00437644                 mov     [esp+9Ch+var_9C], 3FFFFFFFh
.text:0043764B                 call    _bf_mul
.text:00437650                 mov     [esp+9Ch+var_88], eax
.text:00437654                 jmp     loc_437480

op = 0x9F 是加法:
.text:00437700                 mov     [esp+9Ch+var_94], offset ___bf_add_lto_priv_107 ; jumptable 004373B1 case 159
.text:00437708                 jmp     loc_437458
.text:00437458 loc_437458:
.text:00437458                 mov     ecx, [esp+9Ch+var_7C]
.text:0043745C                 mov     edx, [esp+9Ch+var_80]
.text:00437460                 mov     eax, [esp+9Ch+var_74]
.text:00437464                 mov     [esp+9Ch+var_98], 1
.text:0043746C                 mov     [esp+9Ch+var_9C], 3FFFFFFFh
.text:00437473                 call    _bf_op2_lto_priv_103

在js_binary_arith_bigint处下断点,开始调试
name会扩展成16字节,会观察到16次的乘法和加法操作,乘法的参数op1=43,加法的参数op1=name[i]
相当于把43进制的name序列转成bigint x

处理完name的16次循环以后会处理sn
sn输入了28个字符,最后发现进行了14次循环,说明是两个字符一组,
乘法的参数op1=100,加法的参数op1看不出和输入的sn有什么关系,应该是经过了什么运算转换的,暂时也猜不到什么转换算法,
最后按100进制把14个字符转成bigint y

从公开的那一组名字和序列号,可以观察出最后的x和y是相等的,于是得知关系式
最后需要解决的问题就是上面提到的一个未知的转换算法

直接尝试穷举:
name:KCTF
sn:0000
经过前16次的name部分乘法加法组合,得到x在内存中的表示是:00 38 01 3F D8 45 2E 9F EA 40 51 C9
对应16进制大数:C95140EA9F2E45D83F0138
转成10进制:0243377798925556026477314360
对应100进制序列:02 43 37 77 98 92 55 56 02 64 77 31 43 60
再用 16进制表示:02 2B 25 4D 62 5C 37 38 02 40 4D 1F 2B 3C
继续观察到sn的第一次加法op1=0x2A
再来一次
name:KCTF
sn:0100
跳过前16次的name部分乘法加法组合,观察到sn的第一次加法op1=0x2B
重复这个过程,直到sn:ff00
把所有的op1记录下来得到一个表:
2A 2B 28 29 2E 2F 2C 2D 32 33 30 31 36 37 34 35
34 35 32 33 38 39 36 37 3C 3D 3A 3B 40 41 3E 3F
3E 3F 3C 3D 42 43 40 41 46 47 44 45 4A 4B 48 49
48 49 46 47 4C 4D 4A 4B 50 51 4E 4F 54 55 52 53
02 03 00 01 06 07 04 05 0A 0B 08 09 0E 0F 0C 0D
0C 0D 0A 0B 10 11 0E 0F 14 15 12 13 18 19 16 17
16 17 14 15 1A 1B 18 19 1E 1F 1C 1D 22 23 20 21
20 21 1E 1F 24 25 22 23 28 29 26 27 2C 2D 2A 2B
7A 7B 78 79 7E 7F 7C 7D 82 83 80 81 86 87 84 85
84 85 82 83 88 89 86 87 8C 8D 8A 8B 90 91 8E 8F
8E 8F 8C 8D 92 93 90 91 96 97 94 95 9A 9B 98 99
98 99 96 97 9C 9D 9A 9B A0 A1 9E 9F A4 A5 A2 A3
52 53 50 51 56 57 54 55 5A 5B 58 59 5E 5F 5C 5D
5C 5D 5A 5B 60 61 5E 5F 64 65 62 63 68 69 66 67
66 67 64 65 6A 6B 68 69 6E 6F 6C 6D 72 73 70 71
70 71 6E 6F 74 75 72 73 78 79 76 77 7C 7D 7A 7B
把序列[02 2B 25 4D 62 5C 37 38 02 40 4D 1F 2B 3C]在上面表查询索引号得到:
40
01 7f
75
35           
ce d0
0d 17
40
1c 26
35
69 73
01 7f
18 22
看到有7个位置存在双解,组合起来应该是128个解
随便拼接一个:40017535dace0d14401c35690118,本地验证通过

后来fix版排除多解了,但应该也是在这128个组合中的某一组,也不想去验证了


恭喜ID[飞翔的猫咪]获看雪安卓应用安全能力认证高级安全工程师!!

最后于 2020-4-18 14:29 被ccfer编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (1)
雪    币: 5711
活跃值: 活跃值 (953)
能力值: ( LV15,RANK:1431 )
在线值:
发帖
回帖
粉丝
lelfei 活跃值 23 2020-4-20 07:50
2
0
膜拜大佬
游客
登录 | 注册 方可回帖
返回