JavaScript逆向:GlidedSky 字体加密题
发布日期:2021-06-29 11:29:30 浏览次数:3 分类:技术文章

本文共 4142 字,大约阅读时间需要 13 分钟。

题目

题目地址:

在这里插入图片描述
 

解题

单个页面的数据如下,从网页元素中可以看出,网页源码中的数字和我们看到的数字并不同,如果简单爬取网页内容肯定无法达到题目要求。注意右下角篮圈中的字体样式,这就是 372 能显示成 127 的关键所在。

在这里插入图片描述
由于 font-family: glided_sky; 样式以Base64的形式存放在网页中,且网页元素每次刷新都会有不同的网页数字,这里为了便于分析就直接把第一页保存在本地用于编程演示。
在这里插入图片描述
把网页中的字体数据保存解码出来。

import requestsfrom lxml import etreeimport toolsimport base64import xml.dom.minidomfrom bs4 import BeautifulSoupimport refhtml = open('GlidedSky字体加密1.html', 'r', encoding='utf-8')soup = BeautifulSoup(fhtml, 'lxml')#解析

FontCreator 打开 字体文件.ttf 已经可以看到映射关系了。

在这里插入图片描述
再用Python fontTools库 解析字体文件。

from fontTools.ttLib import TTFontfont = TTFont('字体文件.ttf')font.saveXML("字体文件.xml")

解析后的内容如下:

...省略...
...省略...

由 <cmap> 和 <GlyphOrder> 可以列出下面映射。

字符 code(Ascii编码值) name id FontCreator看到的绘制文字
0 0x30 zero 4 3
1 0x31 one 5 4
2 0x32 two 8 7
3 0x33 three 2 1
4 0x34 four 6 5
5 0x35 five 9 8
6 0x36 six 10 9
7 0x37 seven 3 2
8 0x38 eight 7 6
9 0x39 nine 1 0

通过表格,我想到了三种方法还原字体:

  1. 手动映射,直接手动写一个【字符–FontCreator看到的绘制文字】关系映射表,通过这个映射表来获取实际文字。优点:几乎没有技术门槛,编码快捷。缺点:如果字符较多则手动工作量巨大,且无法应对动态字体加密。
  2. 编码中查找【字符–FontCreator看到的绘制文字】的逻辑关系,比如上面可以通过字符的Ascii查询到name,再由name查到对应的id,最后减1即是FontCreator绘制的数字。优点:技术门槛不高。缺点:字符与实际绘制文字并不一定就有逻辑关系,且无法应对动态字体加密。
  3. OCR识别,通过字符对应OCR识别出的字符建立映射关系。优点:可以应对动态字体加密。缺点:技术门槛较高,识别可能不准确。

针对这道题来说,总共也就9个数需要映射,而且每次刷新页面,网页内容的数字都会改变,但实际看到的数字不变。好在每次刷新都符合通过字符的Ascii查询到name,再由name查到对应的id,最后减1即是FontCreator绘制的数字规律。于是可以按如下编码爬取:

import requestsfrom lxml import etreeimport toolsimport base64from fontTools.ttLib import TTFontimport xml.dom.minidomfrom bs4 import BeautifulSoupimport redef saveHtml(url, output_name):    """保存网页内容到本地文件"""    headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36', # 没有Cookie会302到登录页 'Cookie': '__gads=ID=24468711568854be-22bdaffd29c8007c:T=1620874506:RT=1620874506:S=ALNI_MYJCrE0xSUvEfDx7UFPoqgfc0oEoQ; _ga=GA1.2.1515855357.1620874505; footprints=eyJpdiI6IkRZWEx6UFJaNUVOMHVIbkVFSTFvdkE9PSIsInZhbHVlIjoiTUFtM2xOTVZWVVJROUFuYWZuOWlIcFlsbCtaMzFxYzFocmVrZXZlenpCUDZ6K2RJdGp0a1lJOVNzU3NjWEZ6eiIsIm1hYyI6ImUyZjA5ZWZjOGE1YjFlOTcxZjkyYjZiMWJhZWI2MWUwMjQ2MGJlY2U5N2MwMDk0OGM1ZTU4YzMyMTIxMGYxYTIifQ%3D%3D; remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d=eyJpdiI6Im5laDlOMkFKMWx2UHFLMjliWlhHOEE9PSIsInZhbHVlIjoiaDkrZjIySWo0cnk1bEN4cmxhMGd5Z3hxTFNDc1VTejZsdTBoZTJnRVh4a3BxeXJhSWZqWXBmZnYyYzFnWjdleEg5R0hSN2traW9VcmZjZkJNXC9aaVdEMEN5UERZVktiSllUcURKT1VkZ1F6TGl3TXE2YXRoUWFBSVNhMDN5TE04d2NqTk12Y3NRa3FHdGFXbWo5azQwN1pBNnlqWGhBY0pzS0pxd0VNc2ZKdz0iLCJtYWMiOiI5OTFjNTU0YWNlYTk2YWQzZjlkNjI4NDlhYjY1NzEzYTk4YjBlNTcxNzVkNTg5OTBiNjg4NWI0ZTc5NTY4OGI4In0%3D; _gid=GA1.2.1650202755.1621993422; Hm_lvt_020fbaad6104bcddd1db12d6b78812f6=1621994369,1621994747,1621994780,1621994782; XSRF-TOKEN=eyJpdiI6InAwaURUOFNCWjdqU2lCNGV2VFNBVkE9PSIsInZhbHVlIjoidGM1RHFRYnlYQ1ZRdXpoOGJsc2JEQlc1Ym9QZ3VMMXNJY3hOM0lOQlN0VnZJOEpXOVJVUmZZblJFRVh1K0FQcCIsIm1hYyI6IjNlZGI2NGQ0Yjg3NDc2NDNmNzVkYjA2NzhiY2M0YjI2NTliMTUwMTgyZDM0ZmIzNWJlYmYyMjI0NGE0MzM0YjcifQ%3D%3D; Hm_lpvt_020fbaad6104bcddd1db12d6b78812f6=1622078279; glidedsky_session=eyJpdiI6ImRzV2xnQm9LUHJmWFJnUWsydndlUVE9PSIsInZhbHVlIjoiSHZia2dKYnViSmpcL1dZRCtBTGV4bG12RWUxa0YyZnMxaGFPR3RwSEtjWEdJc3FoU2tjd3pmUzIxTnJBa3dEVWUiLCJtYWMiOiJkZTYzMjQyZWU3ZDA4NmY4OTEwZjJiOTI4YzFmY2ZiYmM3NGJkMjQxNjU4MGE2ZTgzZTIzYzNhMWEzZTA4OWUwIn0%3D' } req = requests.get(url, headers=headers) f = open(output_name, 'w', encoding='utf-8') for i in req.text: f.write(i) print('网页保存到'+output_name)def saveFont(input_name, output_name): """从网页文件中获取字体文件""" fhtml = open(input_name, 'rb') soup = BeautifulSoup(fhtml, 'lxml') # 解析

运行,成功:

在这里插入图片描述

转载地址:https://blog.csdn.net/zyc3545/article/details/117325744 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android逆向:看雪20210501W2练习题
下一篇:JavaScript逆向:GlidedSky JSFuck题

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月27日 00时58分13秒