本帖最后由 HNHuangJingYU 于 2021-10-25 09:37 编辑
2021哔哩哔哩程序节日破解逆向第5,6题思路如下:
第五题和第六题的附件是一样的,第五题很好解题,直接将对比的byte数组进行Base64转换再逐个异或3 运算就ok了,太简单不多说,flag = 516834cc-50e448af-bcf9ed53-9ae4328e
直接来到第6题 因为看到了首页加载了一个so层方法,但是没有用到,先不管直接进入so层分析,来到JNO_Onload函数如图:可以看到就动态注册了一个i函数
1
但是没有下文了,这里我配合搜索函数表和shift+f12查看字符表找到关键字bili_2233_3322通过字符交叉引用,最终锁定了all函数,如图:
2
3
嗯有了目标剩下就只剩分析了
1. _system_property_get函数就是验证以下abi型号,和apk的发行版本,ro.build.version.release这里应该就是判断是否加了debuggble关键字去调试程序了
2. 然后来到J_F_E函数这里就是读取手机/data目录下面的的文件了,但是这个app没有去申请读写文件权限就一直进不去判断,当然/data目录也不是一般用户可以读取的,这里有个root权限问题,当完成这里所有的判断后就可以进入字符加密逻辑层了
4
最重要的核心层在ZL7sprintfPcU17pass_object_size1PKcz函数通过传入dest和v10指针(正因为是指针操作地址才会改变它们的值变量)
5
嗯,思路清楚了,就剩执行了,这里因为对手机文件读取一直有问题,所以我就直接改了apk对它进行动态调试,首先在AndroidManifest.xml文件里加入android:debuggable="true"权限,因为是JNO_Oload层所以需要对其进行挂起调试,但是调试的时候再去改逻辑判断就很不舒服,而且多次挂起调试每次都要去改的话,很费时间,索性我就直接在so层就改了so文件如图:
6
将这里的判断进行取反就ok了,但是这里会涉及到file流指针也就是代码中的v6,当用到v6的时候程序就会报空指针
7
索性就再改一次吧,反正v6就只用来存放数据,我直接截取数据就行了,ok!改后图如下:
8
对应的代码我都nop掉了,用IDAPython脚本去nop就很快,所以不用担心费时间,脚本如下,如需自取:
[Python] 纯文本查看 复制代码 ea = idc.here()
addres_start = 0x147C
addres_end = 0x148C
for i in range(addres_start,addres_end):
ida_bytes.patch_byte(i,0x90)
这里选中进行nop也是可以的
[Python] 纯文本查看 复制代码 start = idc.read_selection_start()
end = idc.read_selection_end()
item = idc.next_head(start - 1, end)
while item != BADADDR:
next = idc.next_head(item, end)
ida_bytes.patch_byte(item,0x90)
item = next
因为省去了/data目录下文件的读取所以在动调调试的时候就累点,断点在48、49行也就是加密函数那里,然后按2次F9再进去数据段记下来就好,也就记录8次吧也不是特累 ,因为for循环8次,哈哈哈哈哈,最后整合记下来的数据就是b13981f45ae996d4bc04be5b34662a78因为要按flag格式提交所以最后的答案就是b13981f4-5ae996d4-bc04be5b-34662a78 |