XCTF_MOBILE12_你是谁

初见

附件为一个apk。在模拟器中安装打开先看到一个骚年:

等一会这个画面自动跳过,然后看到一个熟悉的面孔:

 随便点击一下上面的图片,提示“你根本不懂什么叫做爱”,并且能听到语音“你是个好人,但是我们不适合。”:

 发现下面的白色圆圈可以点击:

暂时没有其它信息,下面先静态分析。

静态分析

使用jadx打开apk,先看MainActivity类。

通过jadx的注释信息,可以看到这里面重载了com.iflytek.cloud.SynthesizerListener类的许多函数:

        @Override // com.iflytek.cloud.SynthesizerListener
        public void onCompleted(SpeechError error) {
        }

        @Override // com.iflytek.cloud.SynthesizerListener
        public void onBufferProgress(int percent, int beginPos, int endPos, String info) {
        }

百度一下com.iflytek,得知这是科大讯飞的语音库,可以识别语音为文字,也可以将文字转换为语音,这么说之前听到的语音“你是个好人,但是我们不适合。”应该就是这个库生成的。

在一系列对科大讯飞语音库中函数的重载后,是onCreate,onDestory,setParam,getsna四个函数。

在onCreate里对科大讯飞语音库进行了初始化,并创建了语音识别器:

this.mIat = SpeechRecognizer.createRecognizer(this, this.mInitListener);

语音识别器是用来将语音转化为文字的。

又创建了一个语音合成器:

this.mTts = SpeechSynthesizer.createSynthesizer(this, null);

语音合成器是用来将文字转换为语音的。

关于科大讯飞的语音库,大家可以查阅这篇文章

如此看来,这道题可能要靠说话来做。

上面重载的语音库的诸多函数大多函数体都为空,有一个除外:

@Override // com.iflytek.cloud.RecognizerListener
        public void onResult(RecognizerResult results, boolean isLast) {
            Log.d(MainActivity.this.TAG, results.getResultString());
            try {
                JSONObject res = new JSONObject(results.getResultString()).getJSONArray("ws").getJSONObject(0).getJSONArray("cw").getJSONObject(0);
                MainActivity.this.ss = res.getString("w");
            } catch (Exception e) {
                Log.d(MainActivity.this.TAG, "catch Excepetion");
            }
            if (MainActivity.this.ss.equals("你好")) {
                MainActivity.this.getsna();
            }
            Log.d(MainActivity.this.TAG, MainActivity.this.ss);
}

这个onResult就是语音识别器将语音识别为文字后的响应函数,识别的文字结果在参数result中。

识别结果是JSON格式的,这里用JSON类进行解析。

这个函数核心就是判断,是否说了“你好”,如果说了,就调用getsna打印“haha”:

    public void getsna() {
        Toast.makeText(this, "haha", 0).show();
    }

但这是app的原layout,也就是第一个骚年画面的行为,我们知道,在app运行一段时间后,界面会从骚年图像变成“皇上”图像,这对应了MainActivity.onCreate里的这条语句:

setContentView(new background(this));

接下来我们就看看background这个类的代码。

background类

background类的构造函数中也创建了语音识别器和语音合成器:

this.mIat = SpeechRecognizer.createRecognizer(getContext(), this.mInitListener);
this.mTts = SpeechSynthesizer.createSynthesizer(getContext(), null);

并且在构造函数中将自身设置为屏幕触摸的响应类:

setOnTouchListener(this);

从构造函数中可以猜测,语音识别和屏幕触摸为两个重点。

通过上面对科大讯飞语音库的简单了解我们知道,将我们通过麦克风说的语音转化为文字后,调用的回调函数为onResult。另外屏幕触摸的响应函数为onTouch。

下面我们重点分析这两个函数。

onTouch

经过一些精简,onTouch函数代码为:

    public boolean onTouch(View arg0, MotionEvent e) {
        if  (e.getY() < 815.0f) //触摸位置在上面照片部分
        {
                if (!check()) {
                    this.mTts.startSpeaking("你是个好人,但是我们不适合。 ", this.mSynListener);
                    Toast.makeText(getContext(), "你根本不知道什么叫做爱", 0).show();
                } else {
                    setParam();
                    Log.d(this.TAG, "startListening ret:" + this.mIat.startListening(this.recognizerListener));
                    Toast.makeText(getContext(), "通过爱的验证", 0).show();
                }
        } else {
                int y = (int) ((e.getY() / 106.0f) - 7.0f);
                int x = (int) (e.getX() / 106.0f);
                getcircle(x, y).setStatus(getcircle(x, y).getStatus() ^ 1);
                redraw();  //修改按的圆形的颜色
                if (check()) {
                    Toast.makeText(getContext(), "Right design", 0).show();
                }
        }
        return true;
    }

到这里我发现从代码看,app界面上的圆圈矩阵应该是10*10的,我的模拟器显示不全,怀疑是因为分辨率问题,故调大模拟器的分辨率:

 重新打开app,就能看到完整的圆圈矩阵了:

onTouch函数的逻辑是:

        如果点击位置在上面的图像,调用check函数检查是否通过。

        如果点击下面的矩阵,则修改对应圆形的颜色,并修改矩阵对应的数组的值(0对应白色,1对应红色)。

而check函数逻辑也很简单,就是检查这个矩阵数组中部分成员是否为1:

    public boolean check() {
        return this.matrix[1][1].getStatus() == 1 && this.matrix[1][2].getStatus() == 1 && this.matrix[1][7].getStatus() == 1 && this.matrix[1][8].getStatus() == 1 && this.matrix[2][0].getStatus() == 1 && this.matrix[2][3].getStatus() == 1 && this.matrix[2][6].getStatus() == 1 && this.matrix[2][9].getStatus() == 1 && this.matrix[3][0].getStatus() == 1 && this.matrix[3][4].getStatus() == 1 && this.matrix[3][5].getStatus() == 1 && this.matrix[3][9].getStatus() == 1 && this.matrix[4][0].getStatus() == 1 && this.matrix[4][9].getStatus() == 1 && this.matrix[5][1].getStatus() == 1 && this.matrix[5][8].getStatus() == 1 && this.matrix[6][2].getStatus() == 1 && this.matrix[6][7].getStatus() == 1 && this.matrix[7][3].getStatus() == 1 && this.matrix[7][6].getStatus() == 1 && this.matrix[8][4].getStatus() == 1 && this.matrix[8][5].getStatus() == 1;
    }

按照check函数,将部分圆点为红色,得到一个爱心(好骚的题):

 拼出爱心后,再点击上面的图片,提示“通过爱的验证”:

 onTouch这个验证就通过了,没发现flag。

再看看onResult函数。

onResult

onResult将语音转化为文字后,交给setsna进行处理:

        public void onResult(RecognizerResult results, boolean isLast) {
            Log.d(background.this.TAG, results.getResultString());
            try {
                JSONObject res = new JSONObject(results.getResultString()).getJSONArray("ws").getJSONObject(0).getJSONArray("cw").getJSONObject(0);
                background.this.ss = res.getString("w");
            } catch (Exception e) {
                Log.d(background.this.TAG, "catch Excepetion");
            }
            background.this.getsna(background.this.ss);
            Log.d(background.this.TAG, background.this.ss);
        }

setsna检查转换为的文字是否为中午“傻我是逼”:


    public void getsna(String flag) {
        if (flag.length() == 4) {
            int[] as = new int[flag.length()];
            for (int i = 0; i < flag.length(); i++) {
                as[i] = flag.charAt(i) & 65535;
            }
            for (int j = 0; j < 4; j++) {
                for (int k = j + 1; k < 4; k++) {
                    if (as[j] > as[k]) {
                        int temp = as[j];
                        as[j] = as[k];
                        as[k] = temp;
                    }
                }
            }
            if (as[0] == 20667 && as[1] == 25105 && as[2] == 26159 && as[3] == 36924) {
                Toast.makeText(getContext(), "You get the sorted flag:20667 25105 26159 36924", 0).show();
            } else {
                Toast.makeText(getContext(), "wrong input", 0).show();
            }
        }
    }

“傻我是逼”就是20667/25105/26159/36924这几个数字对应的中文。

如果语音输入为“傻我是逼”的话就打印:"You get the sorted flag:20667 25105 26159 36924"

大致意思是,你得到了打乱顺序的flag。

打乱顺序是“傻我是逼”,原顺序估计就是“我是傻逼”。

最终得到flag为:flag{25105 26159 20667 36924}

———————————————————————————————————————————

欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: pure_color xctf是一个CTF比赛平台,致力于举办和推广网络安全竞赛。 pure_color xctf的目标是为安全爱好者和专业人士提供一个学习、切磋和交流的平台。这个平台上举办的比赛覆盖了各种网络安全领域,包括但不限于网络攻防、密码学、逆向工程等。通过参与这些比赛,参赛者可以提升自己的技能,了解最新的安全威胁和攻击技术,锻炼解决问题的能力。 pure_color xctf的比赛模式多样,可以是个人或团队参与。参赛者需要在限定的时间内完成一系列的题目,这些题目可能包含漏洞分析、编程挑战、数据分析等。比赛过程中,参赛者需要运用各种技术手段,如渗透测试、代码审计、漏洞利用等,解决题目的要求。参赛者不仅需要具备网络安全相关的知识,还需要具备良好的团队合作和解决问题的能力。 此外,pure_color xctf也为参赛者提供了一个交流平台。比赛期间,参赛者可以在平台上与其他选手交流经验、讨论解题思路。参赛者也可以通过竞赛结果来评估自己的能力,并与其他选手进行切磋比拼。 总之,pure_color xctf是一个举办网络安全竞赛的平台,旨在为安全爱好者和专业人士提供学习和交流的机会,促进网络安全技术的发展。 ### 回答2: pure_color xctf 是一项竞技性的网络安全挑战赛。XCCTF 是全球知名的网络安全竞赛组织之一,而 pure_color 是该竞赛组织内的一项赛事。该赛事旨在提升参赛者的网络安全技能和知识,让他们在一个仿真的网络环境中进行攻防对抗。 在 pure_color xctf 中,参赛队伍将根据题目要求进行网络攻击和防御。这些题目有不同的难度级别,并涵盖了各种不同的网络安全技术和攻击类型。参赛队伍将需要利用他们的知识和技能,像真实的黑客一样去攻击系统漏洞,获取目标系统内的敏感信息或是直接控制目标系统。同时,他们也需要通过搭建防御策略和系统来保护自己的系统免受攻击。 pure_color xctf 不仅仅是一个交流学习的平台,也是一个展示能力的舞台。优胜的参赛队伍将会被邀请参加更高级别的网络安全竞赛和会议,进一步提升他们的技能并扩展职业网络。此外,pure_color xctf 也为参赛者提供了一个找到职业机会的平台,很多安全公司和组织会在赛事期间招聘优秀的选手。 总而言之,pure_color xctf 是一个有挑战性的网络安全竞赛,旨在通过攻击和防御对抗提升参赛者的技能,并为他们提供职业发展和展示的机会。同时,这个赛事也在促进网络安全领域的交流和合作,为提升整个网络安全行业的水平做出贡献。 ### 回答3: pure_color xctf 是一个CTF(Capture The Flag,夺旗赛)竞赛平台。CTF是一种网络安全竞赛,旨在让参赛者通过解决一系列的密码学、逆向工程、漏洞利用等问题来获取旗标,比赛者可以通过这些旗标来获取积分并竞争排名。 pure_color xctf 平台是一个为CTF竞赛提供的一个在线环境,类似于一个实验室,用于举办CTF比赛。在这个平台上,参赛者可以注册账号并加入已经发布的CTF赛事中。赛事中的题目被分为不同的难度级别,涵盖了各种安全领域的知识。参赛者需要通过解决题目中的任务来获取旗标,并将其提交到平台上进行验证。在比赛结束后,将根据参赛者解决的题目数量、用时、积分等因素来计算最终排名,并颁发奖励给获胜者。 pure_color xctf 提供了逼真的仿真环境,使得参赛者能够在一个安全的网络环境下进行实时的攻防演练。平台上的题目多样化且具有挑战性,旨在让参赛者将所学的理论知识应用到实际场景中去,并培养解决问题和团队合作的能力。同时,pure_color xctf 还为参赛者提供了交流平台,方便他们在比赛过程中与其他参赛者交流经验、技巧以及解题思路。 总之,pure_color xctf 是一个提供CTF竞赛平台的在线环境,旨在鼓励参赛者在安全领域中深入学习和实践,并通过解决各种挑战赛题目来提升技能和知识水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值