yi
移
dong
动
an
安
quan
全
0x00背景
由于之前未声明原创,无法加入《移动安全系列专辑》,为保证此系列完整性,特此重发一遍,看过的大佬跳过直接看下篇即可~
0x01本文目录
0x02实验目的
通过动态分析调试对腾讯加固进行脱壳尝试
0x03实验开始
1、分析so壳
目标so文件:libshella-2.8.1.so
1.1、使用IDA打开时候若会提示:
这时候注意关键在sectionignore
如果强行打开,则会出现混淆情况
因为elf文件可以没有section,所以我们就可以把section改为00
1.1.1强行打开
全程OK,强行读取,发现文件始终还是可以被反汇编
但是函数部分全部变成sub_xxx
1.1.2使用010editor修改
打开010editor,若未激活最好先激活
1.1.3使用ElF解析器,导入bt文件,然后启用
然后选中section_header_table
使用tool中的and操作改为hex的00
1.1.4另存为并重新放入ida
已经正常显示,这时候就可以静态分析了
1.2、jni函数被加密
由于我们知道so文件加载的时候会首先查看.init或.init_array段是否存在,如果存在那么先运行这段内容,如果不存在那么就检查是否存在JNI_onload(),如果存在则执行jni_onload()。
所以我们可以推测,解密jni_onload()应该就在.init或.init_array处。
因为动态调试so的时候,jni_onload()是可以显示,但是.init或.init_array是无法显示的,所以必须通过静态分析出这两段偏移量然后动态调试的时候计算出绝对位置,然后再makecode(快捷键:c),这样才可以看到该段内代码内容
1.2.1获取so文件中的.init或.init_array
其中两个方法我未尝试成功,不过可以通过linux读取:
readelflibshella.so -a
1.2.2分析.init_array
找到.init函数执行位置,使用IDA查看:
(使用快捷键g)直接搜索
接下来进入到sub_14D4
F5编译一下:
2、启动IDA动态调试
adbshell su /data/local/tmp/as -p31928adb forwardtcp:31928 tcp:31928adb shell am start -D -ncom.qianyu.app/.LoginActivityadb forward tcp:8700jdwp:15127jdb -connectcom.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8652如果出现错误查看serverSocket所监听的端口netstat-nao关键地址:基址+偏移地址
这时候将基址加上偏移地址
即base的值加上2748(查看文章偏移量计算)
4003C000+ 2748 =4003E748
找到位置即可用快捷键C
3、下断点
启动:
运行后在节点处停下进行下一步分析
4、流程式查看
F9到运行在BL unk_400405F4 使用F7进去看到第一个初始化函数;
这里需要注意,可以看到前面是libshella.so而不是其它的so文件,其中几次调试会出现libBugly.so的so文件
进入libshella.so前:
由于没有逻辑处理,紧接着F8回来,再一次F9再一次F7进去:
这里点击P键恢复原函数
可以看到第二个初始化函数:
同步SP寄存器查看就可以看到程序执行流程了
在这里可以跟随函数不断往下走,也可以试试脚本
staticmain(void){ do { step_over(); wait_for_next_event(STEP,-1); }while(PC!=0xEEDAFC2C);//停在何处}
单步跟踪法查询到查询执行死亡的位置,然后定位
进入后,点击P分析代码
5、nop掉反调试
定位寻找函数create()相关的创建线程的反调试函数;
而定位后需要对其进行nop,即将16进制的hex数据改为0000 A0 E1
每一个create函数都会被隐写,因此都需要c键去分析一下,如下unk_7822835C
进去后,按下C键,从而确定为create函数,然后esc键返回。
然后定位create改为nop函数
然后根据libdvm.so计算偏移量:
414CE000+手机本机偏移量计算得偏移量得值=4151DFAC(查阅文章arm手机偏移量)
定位jni_onload()的调用文件点:
运行到此处后F7进入:
P一下后F5查看伪代码查询逻辑,发现调用dlopen打开动态链接库和dlsym返回符号地址
因此这个函数不仅仅是获取函数地址,还可以获取变量地址
在反汇编窗口,运行完程序后找到一个关键跳转点:
在这里return返回前进行了一个逻辑处理:
选择F7跟进处理查看,这里可见需要关注的大多为寄存器的存储值,除此之外,还需要每个函数跟进分析:
在判断以后执行最后一个:
而进去后为:
找到了Android的大多数信息:
却不是执行程序,然后就看第二个函数:
第二个函数传入v4,而v4为:
loaddone!为何load?肯定是用了一些基址函数去读取,继续跟随
可见,v4相当于a1传入,如果是成功的,执行了第五行程序,而第五行程序为什么程序呢?
跟踪查看:
可见,传入的4个值均为注册,而v1程序里,未知的那个值就是读取的dex文件
因此可以推理出,如果这个时候secshell加载成功,dex文件就会被隐藏
我们dump点只能在执行过程后的那一刻,而必须是在执行过程,因此,对v1程序里的那个未知参数进行跟踪:
点D键分析或直接跟踪:
由于篇幅过长,剩余内容敬请阅读下篇详解~
往期经典推荐:
渗透实战(一)|BSides Vancouver 2018 (Workshop)
移动安全(一)|Android设备root及神器Xposed框架安装
>>关于我们:
WhITECat安全团队是起源实验室合作安全团队,主要致力于交流分享团队成员技术研究成果、即时发布最新的漏洞新闻资讯、各大厂商内推通道以及各种安全相关延伸。团队成员目前由起源实验室核心成员、一线安全厂商攻防实验室、某研究院、漏洞盒子TOP10白帽子等人员组成。团队内有不定期的技术交流,(不可描述)工具分享等活动,致力于实现“开放分享”的hack精神。
欢迎各位大佬关注^_^
关注我们
开放共享
扫描上方二维码添加关注
一起分享安全狮的日常
本文始发于微信公众号(WhITECat安全团队):移动安全(九)|TengXun加固动态脱壳(上篇)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论