BabyUnity
简单的il2cpp
难度: hard
出题人: yuro
题目文件链接{: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())