-
-
[原创]看雪.安恒2020 KCTF春季赛第三题 寻踪觅源 WP
-
发表于: 2020-4-19 11:13 3603
-
看雪.安恒2020 KCTF春季赛第三题 寻踪觅源 WP
本题用了QuickJs并打包生成了单一的pe文件。
这个PE的大概过程是:获取输入,将输入替换到字节码特定位置,js环境初始化(包括全局变量、函数、类等),通过JS_ReadObjectRec_lto_priv_489
读取剩余字节码,最后通过JS_EvalFunctionInternal_constprop_63
函数执行字节码。
重点看了下最后实际调用的JS_CallInternal_lto_priv_186
函数,最终字节码的解析执行全在此函数。ida导入头文件后发现opcode与头文件导入的名称不一致。通过函数中的出现的字符常量与一些代码大概比对了下字节码与其名称,小修正下基本就能看了。
理了下字节码,大概的计算过程如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | name = 'D9D951D13E6AE085' num = 0 for i in name: num = num * 43 + ord (i) v = num % 0x7f sn = '2c0e193a0e0aab59493d2b784d38' tmp = sn.decode( 'hex' ) # num1 = int(''.join(map(lambda x:str(int(chr(ord(x)^v).encode('hex'),10)).rjust(2,'0'),tmp)),10) num1 = 0 for i in tmp: t = ord (i)^v num1 = num1 * 100 + (t>> 4 ) * 10 + (t& 0xf ) assert (num = = num1) |
反解代码:
1 2 3 4 5 6 7 8 9 10 11 | name = 'KCTF' * 4 num = 0 for i in name: num = num * 43 + ord (i) v = num % 0x7f snum = str (num) if len (snum) % 2 ! = 0 : snum = '0' + snum tmp = snum.decode( 'hex' ) sn = ' '.join(map(lambda x:chr(ord(x)^v),tmp)).encode(' hex ') print sn |
结果为:40017535dad01714402635730122
。
听说多解,可能是前面可以附加异或值,使进制变换时前附加为0,那多解只是个别啊;还有一种方式多解,就是序列号异或后的字符范围没控制好,这地方多解就比较多了。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2020-4-19 12:23
被poyoten编辑
,原因:
赞赏
他的文章
看原图
赞赏
雪币:
留言: