|

一.前言
最近在学习渗透,web方面太卷了,想弄弄tcp这块百度了一下发现国内外基本一点资料都没,问了一些专门做渗透的大牛。说tcp都没啥人测试方式比较少 洞一定多的爆,顿时让我来了兴趣。原理也很简单就是将tcp解密构造参数然后加密回去提交,于是就找了一款传奇试试刚好是客户的需求。
二.准备工作
2.1信息收集
拿到游戏首先看so库il2cpp.so很明显了 拖到ida中查看发现加固了
接着看看global-metadata.dat 发现头文件符合没加密的特征是正常的(这里坑了我一下午过分信任文件头的特征让我吃了大亏)
2.1提取游戏源码
既然是li2cpp类型的游戏就需要Il2CppDumper这款工具,Il2CppDumper是一款非常优秀且功能强劲实用的Il2Cpp提取工具,Il2CppDumper最新版支持从il2cpp中获取types, methods, fields等等数据,除了支持switch的NSO格式外,最主要的还是完整处理了下MetadataUsage,现在在IDA执行script.py后,F5能看到所调用的实例类,静态类的具体名称了,分析算法和搞些花式修改也更容易。下载链接:https://github.com/Perfare/Il2CppDumper
接着去利用frida dump出内存中的il2cpp.so
[JavaScript] 纯文本查看 复制代码 function dump_so(so_name) {
Java.perform(function () {
var currentApplication = Java.use("android.app.ActivityThread").currentApplication();
var dir = currentApplication.getApplicationContext().getFilesDir().getPath();
var libso = Process.getModuleByName(so_name);
console.log("[name]:", libso.name);
console.log("[base]:", libso.base);
console.log("[size]:", ptr(libso.size));
console.log("[path]:", libso.path);
var file_path = dir + "/" + libso.name + "_" + libso.base + "_" + ptr(libso.size) + ".so";
var file_handle = new File(file_path, "wb");
if (file_handle && file_handle != null) {
Memory.protect(ptr(libso.base), libso.size, 'rwx');
var libso_buffer = ptr(libso.base).readByteArray(libso.size);
file_handle.write(libso_buffer);
file_handle.flush();
file_handle.close();
console.log("[dump]:", file_path);
}
});
}
得到了未修复的so
SoFixer-Windows-64.exe -s libil2cpp.so -o libil2cpp1.so -m 0x0 -d 修复
接着利用Il2CppDumper进行cs以及dll的抽取 发现要我手动找codeRegistration和metadataRegistration
然后借助https://www.jianshu.com/p/3edea788742e这篇帖子的操作找了 填写进去发现会报序列不包括任何匹配元素
在我反复思考看是不是我地址偏移找错的时候 回头看了看global-metadata.dat发现虽然文件头信息虽然一样但是其他文件字节是错误的
再借助大佬的代码dump一下
[JavaScript] 纯文本查看 复制代码 /*
获取解密后的global-metadata.dat
github:https://github.com/350030173/global-metadata_dump
用法:
frida -U -l global-metadata_dump.js packagename
导出的文件在/data/data/yourPackageName/global-metadata.dat
*/
//
//get_self_process_name()获取当前运行进程包名
//参考:https://github.com/lasting-yang/frida_dump/blob/master/dump_dex_class.js
function get_self_process_name()
{
var openPtr = Module.getExportByName('libc.so', 'open');
var open = new NativeFunction(openPtr, 'int', ['pointer', 'int']);
var readPtr = Module.getExportByName("libc.so", "read");
var read = new NativeFunction(readPtr, "int", ["int", "pointer", "int"]);
var closePtr = Module.getExportByName('libc.so', 'close');
var close = new NativeFunction(closePtr, 'int', ['int']);
var path = Memory.allocUtf8String("/proc/self/cmdline");
var fd = open(path, 0);
if (fd != -1)
{
var buffer = Memory.alloc(0x1000);
var result = read(fd, buffer, 0x1000);
close(fd);
result = ptr(buffer).readCString();
return result;
}
return "-1";
}
function frida_Memory(pattern)
{
Java.perform(function ()
{
console.log("头部标识:" + pattern);
var addrArray = Process.enumerateRanges("r--");
for (var i = 0; i < addrArray.length; i++)
{
var addr = addrArray;
Memory.scan(addr.base, addr.size, pattern,
{
onMatch: function (address, size)
{
console.log('搜索到 ' + pattern + " 地址是:" + address.toString());
console.log(hexdump(address,
{
offset: 0,
length: 64,
header: true,
ansi: true
}
));
//0x108,0x10C如果不行,换0x100,0x104
var DefinitionsOffset = parseInt(address, 16) + 0x108;
var DefinitionsOffset_size = Memory.readInt(ptr(DefinitionsOffset));
var DefinitionsCount = parseInt(address, 16) + 0x10C;
var DefinitionsCount_size = Memory.readInt(ptr(DefinitionsCount));
//根据两个偏移得出global-metadata大小
var global_metadata_size = DefinitionsOffset_size + DefinitionsCount_size
console.log("大小:", global_metadata_size);
var file = new File("/data/data/" + get_self_process_name() + "/global-metadata.dat", "wb");
file.write(Memory.readByteArray(address, global_metadata_size));
file.flush();
file.close();
console.log('导出完毕...');
},
onComplete: function ()
{
//console.log("搜索完毕")
}
}
);
}
}
);
}
setImmediate(frida_Memory("AF 1B B1 FA 18")); //global-metadata.dat头部特征
成功!
三.算法分析
得到了dump.cs以及dll
定位到游戏发包函数 接着利用ida插件辅助分析il2cpp.so
alt+f7 根据你的python版本选中 Il2CppDumper中的 ida_py3.py script.json li2cpp.h文件 ida则会自动识别将sub开头的函数识别对应dll中的函数名称 效果如下
经过经过一顿hook定位来到了带有zlib字样的压缩算法
紧接着抓包看看数据包是否带有zlib算法的特征
这里为789c很明显 拿去再进行zlib解密看看是否能够得到明文信息
ok
按照他人给我的思路测试思路则是得到这种json数据则可以开始愉快的渗透测试了
四.测试
也不知道一些这种payload是否有效我咋感觉跟16.7年的wpe类似勒 如果这种渗透测试无效或者存在其他机制联系滴滴 不然显得我特别呆
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|