hgame

hgame
grandFastAndFrustrating
aot 之前闻所未闻的东西
运行 直接退出了 有检测
只要的函数位置
这里就是检测的 这个是检测系统语言的 很明显是有问题的 修改一下转跳
这两段就是终端的回显
这里获取输入
随便搞点输入
报错了根据信息有个frombase64的解码
跟进调试一手
这里就是报错的地方 这里报错的原因就是
这里是判断base后面的== 但是数据是不对的 毕竟fake就写在那
只能去字符串里面搞
可以看到这里是进行base以后还有个gzip和json反序列化 难绷
现在要去找正确的字符串进行base解码
就这个像点
1 | {"mat_a": [[1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 2, -1, 0, -2, 4, -12, 16, 2, -21, -29, 11, -37, 3, 104, 64, 192], [0, 1, 1, 0, 2, 1, 1, 1, -1, 3, -1, -1, -1, 0, -3, 0, -6, 18, 6, -23, -25, 3, -21, -25, 26, 156, -229], [0, -1, 0, 0, 0, -2, 0, 1, 2, 1, 0, 3, -1, -6, 3, -7, 30, -34, -7, 50, 99, -69, 147, -30, -241, -236, 188], [1, 1, 3, 1, 7, -1, 3, 4, 2, 10, -2, 6, -6, -8, -6, -1, 1, 35, 10, -34, 13, -65, 75, -98, -51, 197, 83], [0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 2, 0, -1, 4, 1, -1, 10, 0, 0, -7, 31, -56, 78, -58, -106, 53, -62], [-1, -1, 0, 0, -1, -1, 0, 1, 0, 0, 0, 0, 0, -3, 3, -6, 20, -21, -1, 29, 53, -35, 79, -23, -162, -90, -142], [0, 0, -1, 0, -1, 0, 0, -1, -1, -4, -2, 0, 1, -3, -2, 5, -16, 1, -1, 5, -48, 84, -116, 86, 148, -25, -72], [0, 1, 1, 0, -1, 1, 1, -1, -4, 0, -7, -2, 2, -13, -6, 0, -24, 5, 4, 14, -86, 151, -207, 132, 230, -30, -241], [0, 0, -2, 0, -1, 2, -1, -1, 0, -6, 4, -3, 1, 16, 0, 12, -26, 27, 0, -55, -75, 31, -94, 11, 192, 226, -94], [-1, -1, 0, 0, -2, -1, -1, 0, 0, 1, 2, -1, 1, 1, 6, -8, 24, -22, -1, 24, 63, -66, 112, -50, -180, -111, 37], [0, 0, 1, 0, 3, -1, 1, 3, 2, 5, 2, 2, -3, 1, 1, -6, 25, 2, 5, -10, 69, -119, 169, -134, -240, 124, -169], [0, 0, -2, -1, -3, 2, -2, -2, -1, -5, 3, -4, 3, 14, 2, 6, -24, 23, 4, -52, -86, 36, -114, 10, 234, 189, 62], [-2, 0, -1, 0, -5, 1, -2, -3, -4, -2, 3, -9, 6, 12, 8, -6, 8, -16, -1, 3, -4, -6, -1, -6, -39, -24, -244], [0, 0, -1, 0, -2, 1, -2, -1, 1, -3, 6, -2, 1, 15, 3, 7, -16, 26, 4, -56, -54, -13, -39, -39, 133, 221, 37], [0, 0, 0, 0, 0, 0, -1, 0, 2, 0, 5, -2, 1, 11, 4, -2, 21, -17, -9, 6, 73, -100, 151, -79, -212, -50, 68], [0, 0, 0, 0, 1, -1, 1, 0, 1, 1, -1, 2, -1, -4, 0, -2, 13, -17, -5, 29, 49, -23, 64, 2, -116, -135, 68], [0, 0, -1, -1, -5, 1, -2, -3, -2, -5, 0, -4, 5, 2, 3, -2, -2, -24, -6, 25, -17, 54, -70, 70, 66, -152, 40], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 6, 1, 5, -19, 35, 9, -57, -66, 3, -64, -33, 180, 238, 106], [1, 0, 0, 0, 0, -1, 0, 0, 0, 1, -1, 1, 1, -2, -1, -2, -1, 2, 2, -7, -11, -2, -13, -11, 45, 21, 138], [-1, 0, -1, 0, -3, 1, -2, -2, -1, -1, 7, -6, 4, 22, 8, -3, 10, 3, 2, -41, 9, -97, 87, -113, -75, 172, -72], [0, 0, 0, 0, 1, 0, 0, 1, -1, 1, 1, -1, 0, 3, -1, 2, -9, 24, 10, -40, -44, -1, -37, -38, 77, 232, -226], [0, 1, 0, 0, 2, 2, 0, 1, 1, 0, 3, -3, -1, 13, -2, 5, -10, 23, -1, -43, -20, -30, 13, -51, 13, 207, -149], [0, 1, 1, 0, 2, 1, 0, 1, 0, 7, 5, -2, -1, 11, 3, -6, 18, 16, 8, -43, 41, -141, 159, -169, -169, 216, -12], [1, 0, -1, 0, -1, 1, -1, -2, 0, -4, 1, 0, 0, 2, -2, 7, -14, 1, -2, 1, -29, 49, -69, 63, 106, -36, 57], [1, 0, 0, 0, 4, 0, 0, 2, 4, 1, 6, 3, -4, 13, 1, 5, 10, 19, 0, -45, 50, -138, 166, -142, -139, 192, 198], [0, 1, 1, 0, 0, 1, 0, 0, -2, 3, 1, -3, 1, 6, 1, -3, -1, 18, 8, -35, -23, -29, 4, -61, 28, 173, -70], [1, 1, 0, 0, 1, 2, 0, -1, 0, -3, 1, -1, 0, 8, -4, 12, -33, 31, -1, -45, -83, 63, -129, 47, 244, 159, 77]], "vec_b": [31772, -16089, -5137, 19004, -11231, -30741, 1908, -13072, 12518, -15381, -28148, 26993, -37508, 20766, -10350, -4593, -2569, 33556, 17442, -11570, -9905, -5847, -5959, 13220, 23951, -670, 33570]} |
ok啊 一个矩阵
z3解出正确的key
1 | CompressedEmbeddedResources |
创建了一个aes对象
派生key 长度为48
获取到密钥
解出flag
更新
还有另一个说法 这是问出题人去了
我们可以手动找到正确的base 但是为什么不会去加载正确的base 而是加载错的
搜索字符串也是可以找到这个东西 但是你找不到调用 启动调试以后调用的地方也不是预想的东西 况且程序明显就是一个输入key自解密的流程 静态调试纯坐牢 于是有了这次更新
set ip直接过掉检测
输入
调试 到了这里就是加载对应资源名称的地方
ResourceManager.GetResourceFileName(CultureInfo) 方法 (System.Resources) | Microsoft Learn
阅读一下官方文档
可以看到加载的资源名称 这里就是为什么有些情况下手动修了正确的base但是还是会报错 因为后面的派生密钥也是在这资源中 手动修了
直接启动 当然前提是你main打了断点
这次就没有报错
尊嘟假嘟
这里的逻辑很简单就是拼接字符串
settext方法这里就开始有问题了 有个dexcall 动态加载dex无疑了
还有个native 先去检查native
rc4 没魔改的
再去搞dex
WrBug/dumpDex: 💯一款Android脱壳工具,需要xposed支持, 易开发已集成该项目。
不上frida的话就是用mt管理器 删掉delete
再去资源文件找dex
主要是换表的base 还有个异或 加密逻辑就是先走这个dex的再进行rc4 但是这东西只能爆破拼接的字符串作为key
密文 搓个脚本就行
1 | import re |
脚本搓的时间比分析还久
Delta Erro0000ors
阴间东西
简单说一下逻辑 有一个补丁出题人修改了补丁的校验hsah值 但是出题人给了我们回填校验hsah的机会 最简单的办法就是直接动态调试找到校验的地方 要么抹除校验 要么把真的hash搞到回填 最后这题也是有类似的题目也可以上脚本一把梭
简单修一下 有两次校验 第一次无脑F9就行
这里要改一下避免程序获取不到异常导致炸缸 无脑F9
现在给了回填的机会随便填 因为我们的目的就是找又不是真的指望通过校验
回填了
添加一个硬件断点一会好找
到了这里 f9注意一下内容
左边就是正确的校验hash 右边是我们输入的
1 | 44D292FFE2E91730AE69EB50AE11D04A |
重新启动程序
其他的就不用打断点了直接打一个就行
异或的东西就出来了 干掉校验也简单 已经找到了校验附近的地方手动处理一下就行