题目本身的意图挺好的,但出题人写的慢的和龟一样的图灵机实现多少有点史了
因为龟一样的爆破速度我的二血变三血了
frida还是太超模了
题目本身的意图挺好的,但出题人写的慢的和龟一样的图灵机实现多少有点史了
因为龟一样的爆破速度我的二血变三血了
frida还是太超模了
Unicorn 修复CEST/CSEL有关间接跳转的一些例子
本文中使用大量BianryNinja Python Api 和 Unicorn APi
本文使用腾讯游戏安全大赛2023安卓初赛中的libsec2023.so作为样本
已知bug:
追溯时遇到循环会卡死
还未实现指令前移
进来先随便看看,unity题先看看c#的东西,il2cpp被加密过,ida里解析不出来,考虑运行时dump
直接用frida读,注意到对frida默认的端口做了检测,所以要转发到别的端口上
1 | /* |
1 | import frida |
这样so基本都出来了,再结合ll2cppDumper和apk里找到的global-metadata修复一下c#符号信息
但是因为是dump的,所以偏移和节符号之类的多少有些损坏,这样直接扔进ida里是无法识别的,所以要修复elf,如果手动修的话就是把so扔进010里先跑一遍elf模板识别关键字段,然后把progame_table段里的物理地址值改成虚拟地址对应的值,把文件中的段大小改成内存中的段大小,具体原理就是因为dump下来的elf中数据的偏移都是还在内存中的偏移,同时因为内存中的elf会把一些像stack_segment之类只有在运行时才会占据实际空间的段拓展,所以有些段的位置会被挤歪,也就是物理地址和虚拟地址不符,而ida只识别物理地址,所以要把物理地址的值改成虚拟地址对应的值,还有把在文件中的大小改为在内存中的大小,这样才能定位真实的偏移
节表的部分在dump时都会损坏,要去未解密的so里把节表的部分复制过来
同理对节表(section_table)里的元素也做修正偏移的操作
注意到节表里有个储存各字段名称的部分由elf头里的string_table_index定位
这个值是节表的索引,对应的节表元素里储存了所有表头的名称,这个部分在dump的时候是会丢失的,手动修复就要去原来apk里的so中把对应的部分复制出来(因为表头名称是不加密的)
这些都修完后按理就修好了,修的过程中发现有些elf的部分没识别出来是正常情况,因为没修好010模板无法识别,边修边f5就会逐渐把符号表,节表之类的都显示出来
有的有的,直接上soFixer,修之前记得先用ll2cpp dumper提取符号,然后在用soFixer修,不然修完后的ll2cpp dumper就不识别符号了,用soFixer只要输入dump时的基址就能一键修正偏移了
修完后就是用ll2cppdumper自带的ida脚本把符号信息导入ida,在ida的script file里选择ida_with_struct_py3.py这个脚本,然后按照提示依次选择script.json和il2cpp.h两个文件导入脚本,就可以在ida里恢复符号
记得ida里也要设定基址,在edit->segment->rebase一栏中填入dump时的基址
这样跑完后该有的符号就都有了,因为题目要求做注册机,token是用小键盘输入的,所以先搜下keyboard试试看能不能找到相关函数
可以看到还是找到了,拿frida hook一下看看调用
这里虽然做的时候软件一直崩溃,但还是拿到了hook数据
这里是按了一下1按了一下enter,可以看到最后都调用了SmallKeyboard__iI1Ii,看看这个函数什么情况
可以看到这里针对keyType的三种不同情况做不同处理,其中type=2的情况又调用了别的函数,所以重点hook SmallKeyboard__iI1Ii_469567457968看看这个v23是什么,怀疑是我们的输入
hook结果如下,这个0x7b就是我们输入的123,点进这个函数看,发现最终调用了一个导入函数,如果跳过去是jumpout就手动c一下把数据转成代码,可能是ida误判没有把代码反编译出来
那么这里很有可能是加密了,我们得跳到sec2023这个so的导出表里找这个函数,这里指的是导出表的第十个元素
上文的hook脚本如下
1 | setTimeout(() => { |
因为这里有br跳转干扰静态分析,所以换bn用脚本修跳转
先将csel/cset 修成mov x0 x1 mov x0 x2
然后分别执行两次获取结果
re部分除了最后一道index都做了,index附件本身都跑不起来,而且wasm不好玩,不补了