Logo WP

BabyUnity

简单的il2cpp

难度: hard

出题人: yuro

提示:https://github.com/Perfare/Il2CppDumper/

【看雪论坛】IDA入门

【CSDN】il2cppdumper的使用

题目文件链接{:download="babyunity.zip"}

1. 使用 Il2CppDumper#

直接dump

Il2CppDumper.exe '.\baby unity.exe' '.\baby unity_Data\il2cpp_data\Metadata\global-metadata.dat' .\dumped\

但是报错

ERROR: Can't use auto mode to process file, try manual mode.

Il2CppDumper的README.md提示

Please note that the executable file for the PC platform is GameAssembly.dll or *Assembly.dll

所以应该用 GameAssembly.dll 而不是 baby unity.exe

同样的报错,把dll拖进die,发现有个upx壳,用upx -d GameAssembly.dll 脱壳之后就成功dump了

2. 用脚本导入符号表#

用IDA打开 GameAssembly.dll 之后,运行Il2CppDumper下的 ida_with_struct_py3.py 脚本,

然后按指示顺序打开dump后的文件,就完成了

3. 分析代码逻辑#

物理地址=基地址+偏移地址

这里基地址是 0x180000000

基址怎么来的#

在Dump.cs随便找个函数,比如:

// RVA: 0x9416F0 Offset: 0x9408F0 VA: 0x1809416F0 Slot: 8

用 VA 减去 RVA 就是基址

Wrong! 的地址是 0x1261638,计算之后的地址是 0x181261638,IDA G键跳转,X查看交叉引用

有两个交叉引用,都是在下面的函数引用的

void __stdcall Check__OnClick(Check_o *this, const MethodInfo *method)

有一处代码

if ( System_String__op_Equality(String_6450285200, StringLiteral_4850, 0i64) )

Equality有点像比较两个字符串是否相等,这里的 StringLiteral_4850是一个字符串

XIcKYJU8Buh:UeV:BKN{U[JvUL??VuZ?CXJ;AX^{Ae]gA[]gUecb@K]ei^22

很像加密后的flag

分析下代码,发现是简单的算法

输入s -> base64加密s -> 每个char异或0xF -> 与encflag比较是否相等

所以逆向算法为: encflag每个char异或0xF之后base64解密

最后得到flag

EXP#

enc_flag = "XIcKYJU8Buh:UeV:BKN{U[JvUL??VuZ?CXJ;AX^{Ae]gA[]gUecb@K]ei^22"
result = ''
for c in enc_flag:
    result += chr(ord(c) ^ 0xF)
print(base64.b64decode(result).decode())