吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 24190|回复: 79
收起左侧

[Android 原创] 2020春节红包第三题算法静态分析

  [复制链接]
昨夜星辰恰似你 发表于 2020-2-9 17:02
本帖最后由 昨夜星辰恰似你 于 2020-6-23 10:02 编辑

java层

首先把apk拖到jeb或者其他java反编译工具查看
111.png
可以看到onClick和checkFlag是native方法

so层

看下init段有没有初始化函数
222.png
知道so加载的时候init_array数组中的函数会先于jni_onload方法执行,原理就去看看安卓linker源码吧(不熟悉安卓)
看到定义了一个sub_4DF0函数
333.png
初始化了一些全局变量就没了,基本没啥用,忽视

看jni_onload函数
666.png
很多符号和全局变量我都做了重命名,方便理解
其中函数sub_6A04作用是初始化和创建后面需要用到的j一些java类
555.png
这些符号我都做了对应的重命名
其实上面说的这些和解出这道题关系不大,只是刚接触安卓为了搞懂这些东西的作用

看onclick方法
777.png
获取了编辑框输入然后调用checkFlag方法验证
888.png
checkFlag算法首先把下面这个字符串分为三个部分

thisiskey52pojie_2020_happy_chinese_new_year20200125

用伪代码表示

StringBuilder s1=new StringBuilder("thisiskey");
StringBuilder s2=new StringBuilder("52pojie_2020_happy_chinese_new_year");
StringBuilder s3=new StringBuilder("20200125");

1000.png

1000.png
然后利用s2和s3计算出另一个中间字符串
具体算法是循环35次,每次循环取一个字符,如果本次计数器是能被4整除就从s3中亦或取字符,如果不是就s2中取字符

for (int i=0;i<35;i++){
    if ((i%4==0)&&(i!=0)){
        int index=((i>>2)-1);
        System.out.println(i);
        char c=s3.charAt(index);
        tmp1.append(c);
    }else {
        tmp1.append(s2.charAt(i));
    }
}

1111.png


最后计算tmp1的md5值,注意的是并不是已经转换成16进制字符串的32位字符MD5,而是经过md5运算得到的长度为16的byte数组,然后把md5字节数组和s1字符串取余亦或得到16字节的数组,在转换成32位16进制字符串T,取中间第二位到倒数第二位字符串,也就是T[1:31]共30位字符串和输入字符串比较

完整Java代码如下

static void PrintHex(byte[] buff){
        System.out.print("char data[]={");
        for (int i=0;i<buff.length;i++){
            System.out.printf("0x%x,",buff[i]^0xFF);
        }
        System.out.print("}\n");
    }

    static void ctf(){
        StringBuilder s1=new StringBuilder("thisiskey");
        StringBuilder s2=new StringBuilder("52pojie_2020_happy_chinese_new_year");
        StringBuilder s3=new StringBuilder("20200125");
        StringBuilder tmp1=new StringBuilder();

        for (int i=0;i<35;i++){
            if ((i%4==0)&&(i!=0)){
                int index=((i>>2)-1);
                System.out.println(i);
                char c=s3.charAt(index);
                tmp1.append(c);
            }else {
                tmp1.append(s2.charAt(i));
            }
        }

        System.out.println(tmp1.toString());

        try {
            byte[] buff=tmp1.toString().getBytes();
            System.out.println(buff.length);
            MessageDigest md5=MessageDigest.getInstance("MD5");
            byte[] md5Bytes=md5.digest(buff);
            System.out.println(toHex(md5Bytes));
            byte[] s1_bytes=s1.toString().getBytes();
            for (int i=0;i<md5Bytes.length;i++){
                md5Bytes[i]^=s1_bytes[i%9];
            }
            PrintHex(md5Bytes);
            PrintHex(s1_bytes);
            System.out.println(toHex(md5Bytes));
            System.out.println(toHex(md5Bytes).substring(1,31));
        }catch (Exception se){
            se.printStackTrace();
        }
    }

这道题就是用了java2C,Java层逻辑全部用NDK实现而已,如果有调试设备完全可以不用逆向什么算法,一步到位,动态跟踪也行,hook也行,因为最后出现了明文比较,算是这道题比较弱的地方。可惜回家没有带安卓调试机器,电脑上也没有安卓开发环境(懒得去折腾了),不然可以写xposed 插件+VirtulXposed免Root搞定,还是太菜了,刚学安卓,环境什么的折腾起来太费劲了

444.png
1111.png
2222.png
3333.png
4444.png
5555.png

免费评分

参与人数 24吾爱币 +27 热心值 +19 收起 理由
cpj1203 + 1 + 1 谢谢@Thanks!
烟99 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
723qiangfan + 1 谢谢@Thanks!
陈芳军 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
jFae + 1 + 1 这个可以做什么
此用户无法显示 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
jemmshy + 1 谢谢@Thanks!
sweet你与我 + 1 + 1 我很赞同!
kicchen + 1 我很赞同!
星星之夜 + 1 + 1 我很赞同!
HG/飞飞 + 1 + 1 用心讨论,共获提升!
咸鱼翻身2020 + 1 用心讨论,共获提升!
15035693367 + 1 + 1 谢谢@Thanks!
niyaLaoli + 1 + 1 谢谢@Thanks!
RSu52 + 1 谢谢@Thanks!
onething + 1 + 1 热心回复!
山上的冷 + 1 谢谢@Thanks!
笙若 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
pandada0 + 1 + 1 我很赞同!
yixi + 1 + 1 谢谢@Thanks!
1006706246 + 2 + 1 我很赞同!
女萝岩 + 1 + 1 我很赞同!
smile5 + 1 + 1 用心讨论,共获提升!
天行键丶 + 1 + 1 原来这段key还要这样运算,汇编看不懂加密算法,谢谢大佬了

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2020-2-10 20:15
@昨夜星辰恰似你 我发现你传的图还是有问题,别用md的代码展现图片,用discuz直接点击的方式展现图片,不然传的图过段时间缓存没了就失效了,你看这个方式贴图:https://www.52pojie.cn/misc.php? ... 29&messageid=36
 楼主| 昨夜星辰恰似你 发表于 2020-2-9 17:35
gunxsword 发表于 2020-2-9 17:33
第三题没搞定,KEY也看到了,也看出了和MD5有关,就是中间算法没看明白,动态调试也试了,但是第一次IDA动态,也 ...

动态调试的话,你可以跟踪到最后比较的地方,有明文,或者直接hook equal函数
梦游枪手 发表于 2020-2-9 17:26
我也是静态看出来的,那天刚好没办法调试,不过第四题就只能调试分析了
 楼主| 昨夜星辰恰似你 发表于 2020-2-9 17:28
梦游枪手 发表于 2020-2-9 17:26
我也是静态看出来的,那天刚好没办法调试,不过第四题就只能调试分析了

第四题真的。。。静态看半天,啥都看不出来,调试设备又没有&#128514;&#128514;难受,老哥,等你的文章
赌狗人生丶 发表于 2020-2-9 17:29
感谢分享  哈哈哈            
gunxsword 发表于 2020-2-9 17:33
第三题没搞定,KEY也看到了,也看出了和MD5有关,就是中间算法没看明白,动态调试也试了,但是第一次IDA动态,也不是很会,最终失败!
Hmily 发表于 2020-2-9 17:42
尾部几个图是多的?
 楼主| 昨夜星辰恰似你 发表于 2020-2-9 17:50
Hmily 发表于 2020-2-9 17:42
尾部几个图是多的?

是的,当时写md不会贴图,传了几个附件试试,忘了删除

点评

你编辑删除吧,我怕给你删错了。  详情 回复 发表于 2020-2-9 18:16
zs823455667 发表于 2020-2-9 17:57
感谢大佬分享^_^~~~~
johnwen 发表于 2020-2-9 18:02
感谢大佬,我不会,只能为你加油了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 12:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表