无论是Android或者是Windows都能够使用unity引擎进行开发,但目前对于il2cpp逆向都以Android中的.so文件居多,在我们遇见Windows端的时候很难找到对应的文章来学习,很可能导致连符号表都恢复不了,本篇用于教学Window端的il2cpp逆向如何导入对应的符号表
题目附件在文章最下方
下载附件之后进去能看见il2cpp,然后去网上搜了一下,虽然没有特别好的文章,但是也算是知道要去下一个Il2CppDumper.exe,这是一个在github上开源了的项目,能够dump出il2cpp中隐藏的文件们,链接如下:
https://github.com/Perfare/Il2CppDumper/
在项目中也说明了Il2CppDumper该如何使用,这里就不过多赘述了,作为没见过的新unity题型,我也只能做到边学边做
下一步便是使用Il2CppDumper提取文件,网上只看见提出apk中的libil2cpp.so文件,相当于apk的dll,但我们需要解决的是exe,暂时卡住了,后面经过我的搜索,得到了GameAssembly.dll文件就相当于apk的那个.so文件,接下来就可以进行dump了
随后我跟着网上的教程,却出现了报错:
又卡住了,唉
后来发现那个该死的dll加了一个壳,出题人泥……我去厨房给你拿点钱
是个4.21的UPX壳,由于之前用低版本UPX工具去脱高版本UPX壳时出现过问题,这次我使用对应版本的UPX-d对其进行脱壳:
至此,我们就可以使用Il2cppDumper进行正常dump了
这里就可以看出来我们dump成功了,但由于我没有指定dump出来的路径,因此我们需要进入Il2CppDumper.exe所在的文件夹去寻找出来的文件:
不出意外是能看见这些文件的,我将它们打包到同一个文件夹里面了,而且在DummyDll里面有一个熟悉的文件Assembly-CSharp.dll,见过unity逆向的哥们应该都知道,我们平常的unity都是通过这个文件进行逆向的,但是这次我使用dnSpy打开却没有发现任何东西,只有ChackFlag这些函数名,没有见到任何的密文和函数逻辑,线索到这里又断了……
直到后来,我找到了一篇帖子:[原创]IL2CPP 逆向初探-软件逆向-看雪-安全社区|安全招聘|kanxue.com
没想到是PZ大佬写的,而且巨详细,我决定,跟着这个帖子一步一步往下做
结果又又又又卡住了,不知道怎么导入文件,后来自己找了一下才知道(我alt+F7没反应)
用IDA打开GameAssembly.dll,因为函数比较多的缘故,这需要加载一会
file这一栏有Script file选项,正好对应着Alt+F7
我们点开这个,选择ida_with_struct_py3.py文件
再选择script.json文件
再导入il2cpp.h
最后等待一段时间让IDA加载好函数名就行了
这样就算是恢复符号表了
这时候我们就用dnSpy查看一下Assembly-CSharp.dll里面有哪些函数
我们去IDA中找到对应的函数
进入CheckkkkkkkkkkFlag函数
这一段就是传入我们的input的,然后再加密和比对,我们查看StringLiteral_4850
提取出字符串:XIcKYJU8Buh:UeV:BKN{U[JvUL??VuZ?CXJ;AX^{Ae]gA[]gUecb@K]ei^22
我们再去看看加密函数EEEEEEEEEEEEEncrypt
不难看出,传入的字符串首先进行了base64编码,然后与0xF进行了异或,我们据此可以写出脚本
import base64
enc=""
flag=""
str="XIcKYJU8Buh:UeV:BKN{U[JvUL??VuZ?CXJ;AX^{Ae]gA[]gUecb@K]ei^22"
for i in range(len(str)) :
enc+=chr(ord(str[i])^0xF)
print(enc)
#WFlDVEZ7Mzg5ZjY5MDAtZTEyZC00YzU0LWE4NWQtNjRhNTRhZjlmODRjfQ==
flag=base64.b64decode(enc)
print(flag)
#XYCTF{389f6900-e12d-4c54-a85d-64a54af9f84c}
当然,我们还可以使用赛博厨子直接烤了
至此,解出flag为XYCTF{389f6900-e12d-4c54-a85d-64a54af9f84c}
- baby unity.zip 下载