hgame2021-re部分题解
前言
hgame 2021的逆向部分题解,一道nc题和一道安卓逆向没有做,每周的题目都看了看,做了四分之三左右,杭电的比赛题目出得很有水平,自己学到了很多东西,wp本来说每周都写的,但是懒,比赛都结束一个月了才偷工减料得写出来。有兴趣的师傅凑合着看看吧吧🤪
RE-week1
一杯阿帕茶
明显的TEA加密标志,后面分析为XXTEA加密
加密后的数据,刚好35位
1 |
|
Welcome to reverse world !
简单题,一个异或直接搞定
1 | from ida_bytes import * |
pypy
给了我们python字节码,需要我们自己还原成python代码,下面贴还原过后的代码,加密过程很简单
1 | import dis |
解密脚本
1 | def Cip(): |
RE-week2
helloRe2
有两处检测,第一处直接明文比较,但是注意要倒序
1 | password1: 2b0c5e6a3a20b189 |
第二处开启了另一个线程,利用了第一次检测的输入值异或一次后作为秘钥,进行CBC模式的AES加密,初始向量为0-15
1 | from Cryptodome.Cipher import AES |
app-release
不熟悉安卓,但是经过一系列网上找资料后查到了如何逆向APK代码,过程很简单,就是将KEY进行sha256计算成16位的key,进行AES加密后在进行base64编码
1 | import hashlib |
RE-week3
第三周只做出来一道题
FAKE
简单的smc,函数sub_40699B进行了代码解密工作,首先用idaPython将加密后的代码解码便于静态分析
1 | from ida_bytes import * |
解密后的关键代码
1 | input = (char *)CmpData; |
观察后发现就是一个6*6的矩阵运算,z3解之
1 | from z3 import * |
helloRE3
这道题没有搞出来,后面看wp复现,对于windows消息机制以及带界面的程序逆向不熟悉。
在点击Check时,Dbgview显示order为65并且显示输入长度。
打开ida搜索字符串player找到对应函数,发现有一处 == 65的判定,会给一个值复制为1,x交叉引用发现一只一个函数调用了该全区变量
但是会提示函数无法f5,因为栈指针不平衡。
找到对应的地址,发现有call pop结构,目的是为了将call指令的下一条地址送入rax寄存器中,这里将rax设置为0x00007FF708DE8C3E作为下面rc4加密的秘钥。修复栈指针查看伪代码。
加密流程比较简单,order中的数值取反,RC4加密,比较,RC4的key长度为20,值为地址0x00007FF708DE8C3E处开始的硬编码
1 | # python解密脚本 |
RE-week4
vm
看似很复杂,其实是输入单个字节的加解密,经过动态调试后发现只有异或和减操作,分别对应到的虚拟机指令是4和7,过程为将输入送入vm_eax寄存器,vm_ebx寄存器中是生成的操作数,动态调试即可获得。
1 |
|
AFiveSecondChallenge
比赛时没有做出来,对于c#不熟悉,即使主办方在最后放出了白给Hint,还是搞不出矩阵来,看wp慢慢复现。
首先这是一个扫雷游戏,用c#写的,扫雷的逻辑题目中说明的是通过矩阵运算,所以直接用C#反编译器看看能不能直接搞到源码。但是发现矩阵运算函数被动过手脚。
matrix中的数据很多,根据官方给的提示下载文件中给出了il2cppOutPut文件中有两个重要文件AFiveSecondChallenge
和Assembly-CSharp
,这两个文件中有游戏中的所有逻辑。这里只分析CheckBombAt
函数。
在Assembly-CSharp
文件中看到了这些注释,CheckBombAt函数只有一个参数叫Vector2
,向量中存储的是数组的坐标,但是matrix数组是一个三维数组,但是这个向量中只存储了x和y坐标。
1 | System.Boolean AFiveSecondChallenge.BombChecker::CheckBombAt(UnityEngine.Vector2) |
在看AFiveSecondChallenge.cpp
文件,直接搜索CheckBomAt关键字,定位到该函数。发现了矩阵与运算的主要逻辑
1 | Vector2_tA85D2DD88578276CA8A8796756458277E72D073D L_21 = ___vec0; // 循环时的变量 |
上面的代码化简后就是下面的数学表达式,提取matrix进行图片绘制。
1 | v_2 = (j % 3) - 1; |
1 |
|
最后大概是这样,可以看到是一个二维码。

再用python的PIL库将其打印成二维码
1 | from PIL import Image |
ollvm
这个程序对里面所有的字符串进行了加密,需要慢慢寻找加密函数,在动态调试后发现了AES的S_box盒子,且发现加密模式为CBC模式,动调出key与iv后直接写脚本解密,初始iv为0-15
1 | from Cryptodome.Cipher import AES |