移动安全(十)|TengXun加固动态脱壳(下篇)

admin 2020年9月10日21:46:47评论225 views字数 2045阅读6分49秒阅读模式


yi




dong




移动安全(十)|TengXun加固动态脱壳(下篇)

an




quan




移动安全(十)|TengXun加固动态脱壳(下篇)

移动安全(十)|TengXun加固动态脱壳(下篇)


0x00背景





本文是团队新加入的大佬咸湿小和尚在研究腾讯加固动态脱壳的一些总结经验,篇幅较长,希望各位大佬在细品之下有所收获~



移动安全(十)|TengXun加固动态脱壳(下篇)


0x01本文目录




移动安全(十)|TengXun加固动态脱壳(下篇)




0x02实验目的




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



0x03实验开始




本篇为上一篇移动安全(九)|TengXun加固动态脱壳(上篇)的延续,如果上篇未读,请先点击上面标题移步上篇 >>>>

6、找到关键的线程函数


发现是关键的runCreate,而对应的参数是78017D96


因此我们就要点击为上一个


移动安全(十)|TengXun加固动态脱壳(下篇)


移动安全(十)|TengXun加固动态脱壳(下篇)


进入到这里secshell的读取位置,这时候如果有经验的话,直接可以看到关键点在result,而result最后赋值hi在判断v8以后的


而相对较好就是每一个程序都跟踪一次


移动安全(十)|TengXun加固动态脱壳(下篇)


跟踪v8为判断javavm类型,是否存在libart.so文件,这时候如果模块中没有libart.so文件就说明执行的是23行这个分支:


移动安全(十)|TengXun加固动态脱壳(下篇)


因此,在23行跳进去函数后直接在其实头压栈的时候下好断点:


移动安全(十)|TengXun加固动态脱壳(下篇)


7、查看分析关键函数


然后查看程序:


移动安全(十)|TengXun加固动态脱壳(下篇)


得出:


移动安全(十)|TengXun加固动态脱壳(下篇)


这个时候进行流程图查看:


移动安全(十)|TengXun加固动态脱壳(下篇)


通过执行程序流程图,跟踪程序执行流程:


移动安全(十)|TengXun加固动态脱壳(下篇)


看到这里开始关注寄存器,堆栈,还有汇编的变化,记录每一步的变化:


移动安全(十)|TengXun加固动态脱壳(下篇)


关注点,跟踪解密特殊位置函数,已知数据大小为0x2840


移动安全(十)|TengXun加固动态脱壳(下篇)


跟踪计算偏移量,进行解密


移动安全(十)|TengXun加固动态脱壳(下篇)


可知计算下来的执行下来的R3=0x38C14R2=0x9710,然后R0=R3+R2,然后R3=0x1000, 然后R0=R0+R3=(0x38C14+0x9710)+0x1000,然后逻辑右移0xC,再逻辑左移0xC


因此写出python程序:


hex((((0x38C14+0x9710)+0x1000)>>0xC)<<0xC)


得到结果:


移动安全(十)|TengXun加固动态脱壳(下篇)


0x43000


而数据头文件大小为0x43000+0x28=0x43028


跟踪R0


移动安全(十)|TengXun加固动态脱壳(下篇)


这时候为了方便计算


移动安全(十)|TengXun加固动态脱壳(下篇)


dumpdex


移动安全(十)|TengXun加固动态脱壳(下篇)


staticmain(void){ autofp,begin,end,dexbytefp=fopen("C:\dump.dex","wb"); begin=0x774CE000end=0x775C2000for( dexbyte=begin;dexbyte<end;dexbyte++)     fputc(Byte(dexbyte),fp);}


8、处理dex文件


可以看到,混淆到我都不知道是odex还是dex文件了


移动安全(十)|TengXun加固动态脱壳(下篇)


然后继续看程序,执行解密heard部分数据:


移动安全(十)|TengXun加固动态脱壳(下篇)


这里对R5进行处理:


移动安全(十)|TengXun加固动态脱壳(下篇)


双击R5跟踪:


移动安全(十)|TengXun加固动态脱壳(下篇)


这里竟然出现了dex


说明这里就是起始点,那么还有就是结束点


结束点=起始点+文件大小,应该就在源程序中:


跟踪每一个可疑的数据:


移动安全(十)|TengXun加固动态脱壳(下篇)


看到R20x70就是文件大小,因为:程序执行四个参数分别为寄存器的r0,r1,r2,r3


移动安全(十)|TengXun加固动态脱壳(下篇)


而在输出的时候显示:


移动安全(十)|TengXun加固动态脱壳(下篇)


而这个时候还有一个问题就是第一个程序的文件大小,这样只有偏移量没有大小


这时候又得回到源程序


移动安全(十)|TengXun加固动态脱壳(下篇)


可以看到这里面引入了一个新的变量v70=v00,然后v70执行了一系列操作


不管那么多,先执行,发现v100指向R3


R3A7C14


移动安全(十)|TengXun加固动态脱壳(下篇)


若要分析v100是否为文件大小,向上逻辑虽然找不到,但是至少v70跟踪可以看出


dumpdexheard文件


移动安全(十)|TengXun加固动态脱壳(下篇)


脚本:


staticmain(void)


{


autofp, begin, end, dexbyte;


fp= fopen("C:\dump_heard.dex", "wb");


begin= 0xBED8EC54;


end= 0xBED8EC54+0x70;


for( dexbyte = begin; dexbyte < end; dexbyte ++ )


fputc(Byte(dexbyte),fp);


}


因此程序逻辑清晰了:


先获取到混淆的dex,然后根据偏移量,计算出起始点位置,然后再解密另一个dex文件头部和文件大小,然后拼接处再前面的dex的偏移量起始点处,这时候在赋上第一个文件大小A7C14


然后使用010editor


edit->selectrange


移动安全(十)|TengXun加固动态脱壳(下篇)


然后File->saveselection as file


移动安全(十)|TengXun加固动态脱壳(下篇)


保存后,到dexheard.dex中全选,edit->copy as hex


然后到前面保存好的dexpastefrom hex


移动安全(十)|TengXun加固动态脱壳(下篇)


打开dex


移动安全(十)|TengXun加固动态脱壳(下篇)


完美脱壳!



移动安全(十)|TengXun加固动态脱壳(下篇)



往期经典推荐:

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

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

Apache Solr远程命令执行复现

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

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

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

内网信息收集篇

  MSF 下域内渗透

>>关于我们:

WhITECat安全小组隶属于起源实验室分支安全小组,主要致力于分享小组成员技术研究成果、最新的漏洞新闻、安全招聘以及其他安全相关内容。团队成员暂时由起源实验室核心成员、一线安全厂商、某研究院、漏洞盒TOP10白帽子等人员组成。

欢迎各位大佬关注^_^

关注我们

移动安全(十)|TengXun加固动态脱壳(下篇)

开放共享


扫描上方二维码添加关注

一起分享安全狮的日常







  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2020年9月10日21:46:47
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   移动安全(十)|TengXun加固动态脱壳(下篇)http://cn-sec.com/archives/124891.html

发表评论

匿名网友 填写信息