unity引擎基于Windows下的il2cpp逆向初探——以CTF赛题为例

无论是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}

附件:
0 条评论
某人
表情
可输入 255
目录