Doratmon 发表于 2025-2-17 17:04

2025春节红包之Android初级题Writeup

安装【2025春节】解题领红包之三.apk,打开后显示华为logo,无法点击、滑动。



丢到Jadx分析,看起来`viewPager2.setUserInputEnabled(false)`限制了app的滑动。


使用MT管理器,将false改为true后重打包安装此app。


此时打开可以向右滑动,出现“遥遥领先”图片,图片也可以转动,但是没有发现flag。


有点奇怪🤔,继续审计一下代码。FoldFragment1和FoldFragment2看着有点意思,审计完FoldFragment1主要是mediaPlayer的启动停止相关的功能,没什么用。FoldFragment2的startLongPressTimer()方法有两个加密字符串,有点可疑。


deepseek说是startLongPressTimer()方法处理长按事件的。所以回到遥遥领先页面,长按后发现弹出了“快去寻找flag吧!”。


结合之前出现的两个字符串,可以分析出` TO.INSTANCE.db()`是一个解密函数,密文`cYoiUd2BfEDc/V9e4LdciBz9Mzwzs3yr0kgrLA==` 解密后的明文为“快去寻找flag吧!”,Toast.makeText().show()会弹出解密结果。

基于目前的分析,将密文传入`TO.INSTANCE.db()`解密,然后调用Toast.makeText().show()弹出解密结果应该就可以得到flag了。

完整审计FoldFragment2,发现`onViewCreated()`还有一个加密字符串。


目前的路径变成了解密`hjyaQ8jNSdp+mZic7Kdtyw==`与`2hyWtSLN69+QWLHQ`两个加密字符串,因此会涉及到smali代码的重写。


头大,不会修改smali代码怎么办?用deepseek啊,把需求告诉deepseek,自动生成smali代码,爽歪歪,提示词如下:

```smali
我想在下面的smali代码中添加一个Toast.make().show()方法,传入参数为2hyWtSLN69+QWLHQ,我担心重打包后app不能运行,请你帮我添加一下并告诉我你修改的地方。

.method private static final startLongPressTimer$lambda$1(Lcom/zj/wuaipojie2025/FoldFragment2;)V
    .registers 5

    const-string v0, "this$0"

    invoke-static {p0, v0}, Lkotlin/jvm/internal/Intrinsics;->checkNotNullParameter(Ljava/lang/Object;Ljava/lang/String;)V

    const/4 v0, 0x1

    .line 92
    iput-boolean v0, p0, Lcom/zj/wuaipojie2025/FoldFragment2;->un:Z

    .line 93
    sget-object v0, Lcom/zj/wuaipojie2025/SPU;->INSTANCE:Lcom/zj/wuaipojie2025/SPU;

    invoke-virtual {p0}, Lcom/zj/wuaipojie2025/FoldFragment2;->requireContext()Landroid/content/Context;

    move-result-object v1

    const-string v2, "requireContext(...)"

    invoke-static {v1, v2}, Lkotlin/jvm/internal/Intrinsics;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V

    const/4 v2, 0x2

    const-string v3, "hjyaQ8jNSdp+mZic7Kdtyw=="

    invoke-virtual {v0, v1, v2, v3}, Lcom/zj/wuaipojie2025/SPU;->s(Landroid/content/Context;ILjava/lang/String;)V

    .line 94
    invoke-virtual {p0}, Lcom/zj/wuaipojie2025/FoldFragment2;->getParentFragmentManager()Landroidx/fragment/app/FragmentManager;

    move-result-object v0

    invoke-virtual {v0}, Landroidx/fragment/app/FragmentManager;->beginTransaction()Landroidx/fragment/app/FragmentTransaction;

    move-result-object v0

    .line 95
    sget v1, Lcom/zj/wuaipojie2025/R$id;->fold2:I

    new-instance v2, Lcom/zj/wuaipojie2025/FoldFragment1;

    invoke-direct {v2}, Lcom/zj/wuaipojie2025/FoldFragment1;-><init>()V

    check-cast v2, Landroidx/fragment/app/Fragment;

    invoke-virtual {v0, v1, v2}, Landroidx/fragment/app/FragmentTransaction;->replace(ILandroidx/fragment/app/Fragment;)Landroidx/fragment/app/FragmentTransaction;

    move-result-object v0

    const/4 v1, 0x0

    .line 96
    invoke-virtual {v0, v1}, Landroidx/fragment/app/FragmentTransaction;->addToBackStack(Ljava/lang/String;)Landroidx/fragment/app/FragmentTransaction;

    move-result-object v0

    .line 97
    invoke-virtual {v0}, Landroidx/fragment/app/FragmentTransaction;->commit()I

    .line 98
    invoke-virtual {p0}, Lcom/zj/wuaipojie2025/FoldFragment2;->requireContext()Landroid/content/Context;

    move-result-object p0

    sget-object v0, Lcom/zj/wuaipojie2025/TO;->Companion:Lcom/zj/wuaipojie2025/TO$Companion;

    const-string v1, "cYoiUd2BfEDc/V9e4LdciBz9Mzwzs3yr0kgrLA=="

    invoke-virtual {v0, v1}, Lcom/zj/wuaipojie2025/TO$Companion;->db(Ljava/lang/String;)Ljava/lang/String;

    move-result-object v0

    check-cast v0, Ljava/lang/CharSequence;

    const/4 v1, 0x0

    invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object p0

    invoke-virtual {p0}, Landroid/widget/Toast;->show()V

    return-void
.end method
```

需要注意的是,DeepSeek生成的smali代码中,需要将`cYoiUd2BfEDc/V9e4LdciBz9Mzwzs3yr0kgrLA==`修改为`hjyaQ8jNSdp+mZic7Kdtyw==`,不然还是弹出“快去寻找flag吧!”。


最后重打包安装apk,长按后弹出flag:`flag{xnkl2025!}`

tomliu 发表于 2025-2-18 08:38

厉害呀, 学习到了

huangkang2297 发表于 2025-2-18 14:13

学到了学到了 厉害
页: [1]
查看完整版本: 2025春节红包之Android初级题Writeup