移动安全(九)|TengXun加固动态脱壳(上篇)

  • A+
所属分类:移动安全


yi




dong




移动安全(九)|TengXun加固动态脱壳(上篇)

an




quan




移动安全(九)|TengXun加固动态脱壳(上篇)

移动安全(九)|TengXun加固动态脱壳(上篇)


0x00背景





本文是团队新加入的大佬咸湿小和尚在研究腾讯加固动态脱壳的一些总结经验,篇幅较长,希望各位大佬在细品之下有所收获~
由于之前未声明原创,无法加入《移动安全系列专辑》,为保证此系列完整性,特此重发一遍,看过的大佬跳过直接看下篇即可~


移动安全(九)|TengXun加固动态脱壳(上篇)


0x01本文目录




移动安全(九)|TengXun加固动态脱壳(上篇)




0x02实验目的




通过动态分析调试对腾讯加固进行脱壳尝试



0x03实验开始




1、分析so


目标so文件:libshella-2.8.1.so


移动安全(九)|TengXun加固动态脱壳(上篇)


1.1、使用IDA打开时候若会提示:


移动安全(九)|TengXun加固动态脱壳(上篇)


移动安全(九)|TengXun加固动态脱壳(上篇)


这时候注意关键在sectionignore


如果强行打开,则会出现混淆情况


因为elf文件可以没有section,所以我们就可以把section改为00


1.1.1强行打开


全程OK,强行读取,发现文件始终还是可以被反汇编


移动安全(九)|TengXun加固动态脱壳(上篇)


但是函数部分全部变成sub_xxx


1.1.2使用010editor修改


打开010editor,若未激活最好先激活


1.1.3使用ElF解析器,导入bt文件,然后启用


移动安全(九)|TengXun加固动态脱壳(上篇)


移动安全(九)|TengXun加固动态脱壳(上篇)


移动安全(九)|TengXun加固动态脱壳(上篇)


然后选中section_header_table


使用tool中的and操作改为hex00


移动安全(九)|TengXun加固动态脱壳(上篇)


移动安全(九)|TengXun加固动态脱壳(上篇)


移动安全(九)|TengXun加固动态脱壳(上篇)


1.1.4另存为并重新放入ida


移动安全(九)|TengXun加固动态脱壳(上篇)


已经正常显示,这时候就可以静态分析了


1.2jni函数被加密


移动安全(九)|TengXun加固动态脱壳(上篇)


由于我们知道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


移动安全(九)|TengXun加固动态脱壳(上篇)


1.2.2分析.init_array


找到.init函数执行位置,使用IDA查看:


移动安全(九)|TengXun加固动态脱壳(上篇)


(使用快捷键g)直接搜索


移动安全(九)|TengXun加固动态脱壳(上篇)


接下来进入到sub_14D4


F5编译一下:


移动安全(九)|TengXun加固动态脱壳(上篇)


移动安全(九)|TengXun加固动态脱壳(上篇)


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关键地址:基址+偏移地址


移动安全(九)|TengXun加固动态脱壳(上篇)


这时候将基址加上偏移地址


base的值加上2748(查看文章偏移量计算)


4003C000+ 2748 =4003E748


移动安全(九)|TengXun加固动态脱壳(上篇)


找到位置即可用快捷键C


3、下断点


移动安全(九)|TengXun加固动态脱壳(上篇)


启动:


移动安全(九)|TengXun加固动态脱壳(上篇)


运行后在节点处停下进行下一步分析


4、流程式查看


F9到运行在BL      unk_400405F4          使用F7进去看到第一个初始化函数;


这里需要注意,可以看到前面是libshella.so而不是其它的so文件,其中几次调试会出现libBugly.soso文件


移动安全(九)|TengXun加固动态脱壳(上篇)


进入libshella.so前:


移动安全(九)|TengXun加固动态脱壳(上篇)


由于没有逻辑处理,紧接着F8回来,再一次F9再一次F7进去:


这里点击P键恢复原函数


可以看到第二个初始化函数:


移动安全(九)|TengXun加固动态脱壳(上篇)


同步SP寄存器查看就可以看到程序执行流程了


在这里可以跟随函数不断往下走,也可以试试脚本


staticmain(void){  do {       step_over();      wait_for_next_event(STEP,-1); }while(PC!=0xEEDAFC2C);//停在何处}


单步跟踪法查询到查询执行死亡的位置,然后定位


移动安全(九)|TengXun加固动态脱壳(上篇)


进入后,点击P分析代码


移动安全(九)|TengXun加固动态脱壳(上篇)


移动安全(九)|TengXun加固动态脱壳(上篇)


5nop掉反调试


定位寻找函数create()相关的创建线程的反调试函数;


而定位后需要对其进行nop,即将16进制的hex数据改为0000 A0 E1


每一个create函数都会被隐写,因此都需要c键去分析一下,如下unk_7822835C


进去后,按下C键,从而确定为create函数,然后esc键返回。


移动安全(九)|TengXun加固动态脱壳(上篇)


移动安全(九)|TengXun加固动态脱壳(上篇)


移动安全(九)|TengXun加固动态脱壳(上篇)


然后定位create改为nop函数


移动安全(九)|TengXun加固动态脱壳(上篇)


移动安全(九)|TengXun加固动态脱壳(上篇)


然后根据libdvm.so计算偏移量:


414CE000+手机本机偏移量计算得偏移量得值=4151DFAC(查阅文章arm手机偏移量)


移动安全(九)|TengXun加固动态脱壳(上篇)


定位jni_onload()的调用文件点:


移动安全(九)|TengXun加固动态脱壳(上篇)


运行到此处后F7进入:


移动安全(九)|TengXun加固动态脱壳(上篇)


P一下后F5查看伪代码查询逻辑,发现调用dlopen打开动态链接库和dlsym返回符号地址


因此这个函数不仅仅是获取函数地址,还可以获取变量地址


在反汇编窗口,运行完程序后找到一个关键跳转点:


在这里return返回前进行了一个逻辑处理:


移动安全(九)|TengXun加固动态脱壳(上篇)


选择F7跟进处理查看,这里可见需要关注的大多为寄存器的存储值,除此之外,还需要每个函数跟进分析:


移动安全(九)|TengXun加固动态脱壳(上篇)


在判断以后执行最后一个:


移动安全(九)|TengXun加固动态脱壳(上篇)


而进去后为:


找到了Android的大多数信息:


移动安全(九)|TengXun加固动态脱壳(上篇)


却不是执行程序,然后就看第二个函数:


移动安全(九)|TengXun加固动态脱壳(上篇)


第二个函数传入v4,而v4为:


移动安全(九)|TengXun加固动态脱壳(上篇)移动安全(九)|TengXun加固动态脱壳(上篇)


loaddone!为何load?肯定是用了一些基址函数去读取,继续跟随


移动安全(九)|TengXun加固动态脱壳(上篇)


可见,v4相当于a1传入,如果是成功的,执行了第五行程序,而第五行程序为什么程序呢?


跟踪查看:移动安全(九)|TengXun加固动态脱壳(上篇)


可见,传入的4个值均为注册,而v1程序里,未知的那个值就是读取的dex文件


因此可以推理出,如果这个时候secshell加载成功,dex文件就会被隐藏


我们dump点只能在执行过程后的那一刻,而必须是在执行过程,因此,对v1程序里的那个未知参数进行跟踪:移动安全(九)|TengXun加固动态脱壳(上篇)


D键分析或直接跟踪:


移动安全(九)|TengXun加固动态脱壳(上篇)


由于篇幅过长,剩余内容敬请阅读下篇详解~



移动安全(九)|TengXun加固动态脱壳(上篇)



往期经典推荐:


漏洞笔记|记一次与XXE漏洞的爱恨纠缠

深入探究浏览器编码及XSS Bypass

Apache Solr远程命令执行复现

“最后”的Bypass CDN 查找网站真实IP

渗透实战(一)|BSides Vancouver 2018 (Workshop)

移动安全(一)|Android设备root及神器Xposed框架安装

内网信息收集篇

MSF 下域内渗透

>>关于我们:

WhITECat安全团队是起源实验室合作安全团队,主要致力于交流分享团队成员技术研究成果、即时发布最新的漏洞新闻资讯、各大厂商内推通道以及各种安全相关延伸。团队成员目前由起源实验室核心成员、一线安全厂商攻防实验室、某研究院、漏洞盒子TOP10白帽子等人员组成。团队内有不定期的技术交流,(不可描述)工具分享等活动,致力于实现“开放分享”的hack精神。

欢迎各位大佬关注^_^

关注我们

移动安全(九)|TengXun加固动态脱壳(上篇)

开放共享


扫描上方二维码添加关注

一起分享安全狮的日常







本文始发于微信公众号(WhITECat安全团队):移动安全(九)|TengXun加固动态脱壳(上篇)

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: