首页
论坛
课程
招聘
[原创]看雪.安恒2020 KCTF春季赛第三题 寻踪觅源 WP
2020-4-19 11:13 1620

[原创]看雪.安恒2020 KCTF春季赛第三题 寻踪觅源 WP

2020-4-19 11:13
1620

看雪.安恒2020 KCTF春季赛第三题 寻踪觅源 WP

本题用了QuickJs并打包生成了单一的pe文件。
这个PE的大概过程是:获取输入,将输入替换到字节码特定位置,js环境初始化(包括全局变量、函数、类等),通过JS_ReadObjectRec_lto_priv_489读取剩余字节码,最后通过JS_EvalFunctionInternal_constprop_63函数执行字节码。
重点看了下最后实际调用的JS_CallInternal_lto_priv_186函数,最终字节码的解析执行全在此函数。ida导入头文件后发现opcode与头文件导入的名称不一致。通过函数中的出现的字符常量与一些代码大概比对了下字节码与其名称,小修正下基本就能看了。
理了下字节码,大概的计算过程如下:

  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)

反解代码:

  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,那多解只是个别啊;还有一种方式多解,就是序列号异或后的字符范围没控制好,这地方多解就比较多了。


[公告]名企招聘!

最后于 2020-4-19 12:23 被poyoten编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回