[2021铁人赛 Day27] Reverse Engineering 逆向工程 01

  • 引言
    今天来解逆向工程的题目吧!
    逆向工程 听起来好像很厉害,但其实就是一种过程而已。

    [维基百科: 逆向工程]
    逆向工程(Reverse Engineering),又称反向工程,是一种技术过程,即对一专案标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能效能规格等设计要素,以制作出功能相近,但又不完全一样的产品。

    对市面上软件的深入分析後再设法重造,也算是一种逆向工程。
    这主题的题目会提供一些结果给你 (档案等) ,请你设法从中找出正常使用下或许无法取得的资讯。
    一个最好理解的例子是:拿到二进位档,设法取得某程序码区块的资讯,或是某某变数的值等。

  • Reverse Engineering / Transformation
    https://ithelp.ithome.com.tw/upload/images/20211012/20111429qBZE8I9npB.png
    这题看起来跟编码有关,因为它除了提供了一个叫做 enc 的档案外,
    也提供了一段 Python code ,能看到程序码中有 chrord 等熟悉语法,
    这两者正是用来做字串编码转换用途的。

    分析完题目,我们先把 enc 下载下来看看:

    灩捯䍔䙻ㄶ形楴獟楮獴㌴搂潦弸强㕤㐸㤸扽
    

    很好,这就是我们玩游戏或是使用国外软件时常遇到的乱码对吧!
    这边也可以来学习一点小知识,其实所谓的乱码,就是编码不对的问题罢了。
    世界上所有的编码,包括 UTF-8, ASCII, BIG5 等等常看到的编码,
    最後都是转换成 01010101... ,因为电脑也只看得懂 0101 对吧?
    所以你可以试想一个情境:


    假设 apple 这个字的 UTF-8 编码是 01010000 (纯粹假设,并不是这个编码) ,
    今天如果写信的人他使用 UTF-8 编码规则,写了一个 apple 并编成 UTF-8 ,
    最後送到你手里,因此你会收到 01010000 这个编码後的资料。

    然後你搞错对方的编码方式,你用 ASCII 来解码这个讯息,
    01010000 刚好是 P 的 ASCII code ,所以这封信意思就变成 P

    从头到尾,信件内容 (01010000) 都没变,变的是你们双方的编码方式。


    所以乱码其实就是双方编码不同造成的误会,
    日本人写的游戏中的文字编码可能是 Shift_JIS 这个编码,
    拿到你的电脑来可能用 BIG5 解码,当然就是一堆乱码罗。

    所以才会有万国码的存在,让各种语言都可以统一成一种编码来表示。

    回到题目,提示说你可以到网路上找找解码器,但是我们并不知道这个乱码本来的编码是什麽。
    所以我先找到一个多功能编码器:
    https://string-functions.com/encodedecode.aspx
    它可以解编码许多不同的编码方式,这时候就只能猜了。

    但是并不是瞎猜,还记得题目有给一段 Python 程序对吧,
    可以看到它将 flag 字串每个字元编码往左边移八位 (位元运算) ,
    然後加上该字元的右边字元的编码,最後再编成新字元。

    讲起来很复杂,其实就是将两个字元编成一个字元的概念,
    UTF-8 是很常使用的编码,我们先猜测原本是用 UTF-8 来撰写讯息的,
    那麽两个八位元的字元组合成一个十六位元的字元,合理猜测有可能是 UTF-16 !

    所以我们将乱码丢到转换器中,选择 UTF-16 转 UTF-8 :
    https://ithelp.ithome.com.tw/upload/images/20211012/20111429GkGjAvUce8.png
    哦?结果看起来不是乱码了,非常像 flag 形式,但又不是...

    观察後发现两两一组的话,每一组都前後颠倒了,
    难道编码还是错误?

    打开转换的选单:
    https://ithelp.ithome.com.tw/upload/images/20211012/20111429FAbJf9KL4d.png
    还有另一种 UTF-16 ?
    改成这个以後:
    https://ithelp.ithome.com.tw/upload/images/20211012/20111429GRxcNKF30I.png
    成功找到 flag !

    p.s: UTF-16 有分成 Big Endian 以及 Little Endian (位元组顺序) ,
    这题刚好是需要 BE (Big Endian) 的版本。


<<:  大脑如何精准学习 (1) 注意力

>>:  DAY27:GCP架设VM

新新新手阅读 Angular 文件 - Day05

学习内容 这篇内容是纪录阅读官方文件 Create a feature component 的内容。...

[Day10] Face Detection - 使用OpenCV & Dlib:OpenCV DNNs

本文开始 使用OpenCV DNNs方式来侦测人脸,虽然这个方式会使用到深度学习神经网路(框架为SS...

【修正模型】4-3 事件循环(Event Loop)与任务队列(Job Queue)

同步(Synchronous)与非同步(Asynchronous) 在理解执行上下文与呼叫堆叠之後,...

Day 6 - Function 时空旅行 (1) - 参数优化

前言 Array 跟 Object 两兄弟的故事告一段落了,接着是 Object 在外面养(?)的另...

Day8 Swagger UI & Open Match APIs

Swagger UI 是一个将 API 文件与 API 请求产生结合的介面套件,官方已於建立核心的 ...