查看: 532|回复: 2

[Reverse] 实战讲解:Crakeme01-Android安全

[复制链接]
发表于 2020-9-22 11:02:28 | 显示全部楼层 |阅读模式

相关题目:

♦ Crakeme01

  先运行软件,观察程序特点,步骤与之前讲解实战:AliCrackme实战相似,都是运用IDA静态调试与动态调试相结合获取密码,从而进入功能页面,具体操作流程如下。
jdax-gui中分析java代码  在xml文件里,找到程序入口点,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  直接查看click,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  此处if的判断与之前分析的AliCreackme不同。先判断它是否为空,如果为空,先弹出对应字符;如果不为空,直接把字符给被Native修饰的方法调用,也就是说,输入字符的对错结果和返回的字符串都在so层处理。
IDA中静态分析  1.找到JNI_OnLoad,进入后,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  2.按F5查看伪代码,修改参数类型和名称,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  3.调用一个AD函数,然后是一个if-else判断,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  4.进入AD函数,查看字眼是检测进程,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  5.查看静态注册,搜索后发现没有静态注册的函数,那逻辑的执行部分肯定是在动态注册里,但是动态注册的伪代码里面只识别到两个函数,AD和GetEnv,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  6.查看汇编窗口,除了if里面的两个BL跳转函数之外,下面的else里面还有一个BL跳转函数,而且很明显是4个参数,RegisterNative恰好就是4个参数,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  静态分析就到这里,接下来开始IDA动态调试,验证我们的推论。
IDA动态调试  直接修改名字和端口就可以直接过掉,记录动态分析的过程,进来后,检测函数nop掉,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  F8一路往下,来到这个可能是RegisterNative函数的位置,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  观察第三个参数,发现是一个地址,可以跳过去,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  点击过去,然后按d键,识别成dword类型的地址,看到存放的内容是一个 java层被native修饰的方法名,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  同样识别第二个和第三个参数,第二个参数是方法签名,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  第三个参数是C代码中的底层函数实现的函数名,bc过来后,看到这里的标志位T是1,说明是thumb指令,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  按c键,将此处代码识别成thumb指令,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  这个bc函数就是我们要分析的关键逻辑所在,直接在导出函数里面搜索,过来后F5识别伪代码,分析这里的逻辑,这是一个字符转换,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  进dc里面看看,发现有一个 dh,继续跟进去,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  有kill和getpid,与进程检测有关,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  继续跟进,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  有getpid,也与进程检测有关,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  它执行的条件是上面的dc返回为真,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  dc的返回值取决于此处,想给上一层返回一个真,那必须是if里面的执行,首先dh要返回一个真,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  进去dh,它想给上层返回一个真,必须是memcmp这个执行成立,否则就执行下面的else,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  回到dc,查看这个函数的返回结果,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  返回结果又由dh决定,在dh里面返回上一层是0或者是1,取决于这三个点,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  回到bc,查看这个函数,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  发现了解密函数,由上层可以知道,他的返回值是一个int,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  该函数的返回值由这两处决定,v4是v7给的,由上面可知,v7是一个组数,v7最终会给v4,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  v4作为返回值传递给上一层,然后作为参数传递给这个函数,将最终结果作为bc的返回值,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  点进去观察这个函数,会发现是调用toast函数,它与弹窗有关,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  接下来在bc进行动态分析,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  跳至R0指向的地址,这个就是刚才手动输入的密码,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  下面一个BLX跳转后面紧跟着一个CBZ,就是静态分析里面的dc函数,由dc的返回值决定if的执行,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  直接步过这个函数,发现返回值为零,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  直接执行else,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  这个函数是解密函数,里面有RC4算法,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  来到解密函数处,下断点,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  一路F8走到这里,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  继续分析,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  观察F7寄存器的值,跳过来就得到正确的密钥,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  继续单步往下,查看R7的值,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  过来R7,提示密码错误,如下图所示。

实战讲解:Crakeme01-Android安全

实战讲解:Crakeme01-Android安全
  这就是结合静态分析和动态调试得到的结果,静态分析能够更方便的阅读逻辑,得到一些关键点,动态调试的目的是查看具体数据。
小结  在本次的分享当中,先从java层简单分析到so层,然后静态分析了so里面的动态注册方法,随后又进行了动态调试so,过掉反调试,并且找到bc函数,静态分析bc函数,最后在bc函数处找解密函数下断点,然后找到密钥。

游客,如果您要查看本帖隐藏内容请回复


温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046

0

主题

26

帖子

0

精华

VIP

Rank: 16

学币
277
荣耀
1
rank
42
违规
0

    发表于 2020-9-23 21:17:11 | 显示全部楼层
    这个题目看起来很复杂 能学到不少知识 谢谢
    学逆向论坛-免费的逆向学习论坛

    0

    主题

    4

    帖子

    0

    精华

    初级会员

    Rank: 4

    学币
    3
    荣耀
    0
    rank
    0
    违规
    0

      发表于 2020-10-19 10:56:40 | 显示全部楼层
      啥也不说了,加入收藏!
      学逆向论坛-免费的逆向学习论坛
      微信公众号
      快速回复 返回顶部 返回列表