吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 981|回复: 14
收起左侧

[CTF] 2025解题领红包 Windows/Android初级Writeup

  [复制链接]
Command 发表于 2025-2-13 08:21

Windows

这题做的感觉跟瞎猫碰死耗子一样 (

拿到程序, 第一时间直接拖进IDA

52PJ2025_1.png

呃, 然后发现一堆识别不出来的(照这玩意看容易被带偏)... 还得OD

随便输点什么 (例如: 114514), 然后用OD断在上图中v20 = (_DWORD)v71 == v17;处 (下面有个判断, 可以感觉出来是长度判断)

52PJ2025_2.png

注意到esi即为为我们输入的长度, 和edi进行比较, 而edi为0x1B, 也就是说输入的长度必须为27

但其实这里如果你长度输入不对也没关系, 可以设置EIP到长度正确时的位置

52PJ2025_3.png

然后一直按F8, 期间会经过一个循环 (解密flag), 然后要注意观察

52PJ2025_4.png

Flag即为: fl@g{52pOj1E_2025#Fighting}

Android

三折叠, 怎么折, 都有面

Jadx打开, 发现有两个Fragment, 默认打开的是FoldFragment1

public final class FoldPagerAdapter extends FragmentStateAdapter {
    public static final int $stable = 0;

    @Override // androidx.recyclerview.widget.RecyclerView.Adapter
    public int getItemCount() {
        return 2;
    }

    /* JADX WARN: 'super' call moved to the top of the method (can break code semantics) */
    public FoldPagerAdapter(FragmentActivity activity) {
        super(activity);
        Intrinsics.checkNotNullParameter(activity, "activity");
    }

    @Override // androidx.viewpager2.adapter.FragmentStateAdapter
    public Fragment createFragment(int position) {
        if (position == 0) {
            return new FoldFragment1();
        }
        if (position == 1) {
            return new FoldFragment2();
        }
        throw new IllegalStateException("Unexpected position: " + position);
    }
}

FoldFragment1只是放音频的, 没用, 所以直接看FoldFragment2

public final class FoldFragment2 extends Fragment {
    public static final int $stable = 8;
    private final long LONG;
    private float a;
    private final float b;
    private final int c;
    private final int f;
    private final int g;
    private long l;
    private Handler longPressTimer;
    private final float r;
    private boolean un;

    public FoldFragment2() {
        super(C1347R.layout.activity_fragment_fold2);
        this.b = 180.0f;
        this.c = 10;
        this.r = 180.0f / 10;
        this.f = 5;
        this.g = 500;
        this.LONG = 3000L;
    }

    @Override // androidx.fragment.app.Fragment
    public void onViewCreated(View view, Bundle savedInstanceState) {
        Intrinsics.checkNotNullParameter(view, "view");
        super.onViewCreated(view, savedInstanceState);
        final ImageView imageView = (ImageView) view.findViewById(C1347R.id.imageView);
        final GestureDetector gestureDetector = new GestureDetector(requireContext(), new GestureDetector.SimpleOnGestureListener() { // from class: com.zj.wuaipojie2025.FoldFragment2$onViewCreated$gestureDetector$1
            @Override // android.view.GestureDetector.SimpleOnGestureListener, android.view.GestureDetector.OnGestureListener
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                long j;
                int i;
                int i2;
                int i3;
                float f;
                float f2;
                float f3;
                float f4;
                float f5;
                float f6;
                float f7;
                float f8;
                Intrinsics.checkNotNullParameter(e2, "e2");
                if (e1 == null) {
                    return true;
                }
                long currentTimeMillis = System.currentTimeMillis();
                j = FoldFragment2.this.l;
                long j2 = currentTimeMillis - j;
                i = FoldFragment2.this.g;
                if (j2 < i) {
                    return true;
                }
                float x = e2.getX() - e1.getX();
                i2 = FoldFragment2.this.f;
                if (x >= (-i2)) {
                    i3 = FoldFragment2.this.f;
                    if (x > i3) {
                        FoldFragment2 foldFragment2 = FoldFragment2.this;
                        f = foldFragment2.a;
                        f2 = FoldFragment2.this.r;
                        foldFragment2.a = RangesKt.coerceAtLeast(f - f2, 0.0f);
                    }
                } else {
                    FoldFragment2 foldFragment22 = FoldFragment2.this;
                    f6 = foldFragment22.a;
                    f7 = FoldFragment2.this.r;
                    float f9 = f6 + f7;
                    f8 = FoldFragment2.this.b;
                    foldFragment22.a = RangesKt.coerceAtMost(f9, f8);
                }
                ImageView imageView2 = imageView;
                f3 = FoldFragment2.this.a;
                imageView2.setRotationY(f3);
                f4 = FoldFragment2.this.a;
                f5 = FoldFragment2.this.b;
                if (f4 >= f5) {
                    SPU spu = SPU.INSTANCE;
                    Context requireContext = FoldFragment2.this.requireContext();
                    Intrinsics.checkNotNullExpressionValue(requireContext, "requireContext(...)");
                    spu.m136s(requireContext, 1, "2hyWtSLN69+QWLHQ");
                }
                FoldFragment2.this.l = currentTimeMillis;
                return true;
            }
        });

    /* JADX INFO: Access modifiers changed from: private */
    public static final void startLongPressTimer$lambda$1(FoldFragment2 this$0) {
        Intrinsics.checkNotNullParameter(this$0, "this$0");
        this$0.un = true;
        SPU spu = SPU.INSTANCE;
        Context requireContext = this$0.requireContext();
        Intrinsics.checkNotNullExpressionValue(requireContext, "requireContext(...)");
        spu.m136s(requireContext, 2, "hjyaQ8jNSdp+mZic7Kdtyw==");
        this$0.getParentFragmentManager().beginTransaction().replace(C1347R.id.fold2, new FoldFragment1()).addToBackStack(null).commit();
        Toast.makeText(this$0.requireContext(), C1349TO.INSTANCE.m142db("cYoiUd2BfEDc/V9e4LdciBz9Mzwzs3yr0kgrLA=="), 0).show();
    }

可以发现调用了TO.Companion.dbSPU.s进行解密

SPU.s最后也是调用TO.Companion.db

public final void m136s(Context context, int index, String value) {
    Intrinsics.checkNotNullParameter(context, "context");
    Intrinsics.checkNotNullParameter(value, "value");
    context.getSharedPreferences("F", 0).edit().putString(String.valueOf(index), C1349TO.INSTANCE.m142db(value)).apply();
}
// TO
public final class C1349TO {
    public static final int $stable = 0;

    /* renamed from: Companion, reason: from kotlin metadata */
    public static final Companion INSTANCE = new Companion(null);
    private static final String YYLX = "my-xxtea-secret";
    /* renamed from: com.zj.wuaipojie2025.TO$Companion, reason: from kotlin metadata */
    public static final class Companion {
        public /* synthetic */ Companion(DefaultConstructorMarker defaultConstructorMarker) {
            this();
        }

        private Companion() {
        }

        /* renamed from: db */
        public final String m142db(String value) {
            Intrinsics.checkNotNullParameter(value, "value");
            byte[] decode = Base64.decode(value, 0);
            C1348T c1348t = C1348T.INSTANCE;
            Intrinsics.checkNotNull(decode);
            byte[] bytes = C1349TO.YYLX.getBytes(Charsets.UTF_8);
            Intrinsics.checkNotNullExpressionValue(bytes, "this as java.lang.String).getBytes(charset)");
            return new String(c1348t.m140de(decode, bytes), Charsets.UTF_8);
        }
}

可见是XXTea (my-xxtea-secret瞩目)

直接偷一波懒, 用Frida调用TO.Companion.db解密那几个字符串

Java.perform(
    function () {
        let TO = Java.use("com.zj.wuaipojie2025.TO")
        console.log(TO.Companion.value.db("hjyaQ8jNSdp+mZic7Kdtyw=="))
        console.log(TO.Companion.value.db("2hyWtSLN69+QWLHQ"))
        console.log(TO.Companion.value.db("cYoiUd2BfEDc/V9e4LdciBz9Mzwzs3yr0kgrLA=="))
    }
)

输出:

xnkl2025!}
flag{
快去寻找flag吧!

故Flag为: flag{xnkl2025!}

免费评分

参与人数 7威望 +1 吾爱币 +32 热心值 +7 收起 理由
wasdzjh + 1 + 1 我很赞同!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
love61828314 + 1 + 1 我很赞同!
正己 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
ck6102 + 1 + 1 热心回复!
woyucheng + 1 + 1 谢谢@Thanks!
mengjingzhimo + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

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

 楼主| Command 发表于 2025-2-13 11:56
dongye 发表于 2025-2-13 11:33
我的看着有很多 HIDWORD,LOBYTE之类的东西这个是需要修改什么东西才会正常显示么

这个我这也很多. 这个倒像是程序本身的行为, 不算是反编译错误吧
比方说HIDWORD就是从一个64位值取高32位
如果要是想把他去掉... 试试改类型? 从64位换32位
wasdzjh 发表于 2025-3-19 14:26
我不明白一点,ida破解程序的时候,你说的v20 = (_DWORD)v71 == v17;  这个位置,在od是怎么找的?有什么方法吗?
sadffg 发表于 2025-2-13 08:29
g372145 发表于 2025-2-13 08:32
本帖最后由 g372145 于 2025-2-13 08:36 编辑

哪位代表来讲解一下,让小白也学习一下。
Edsion.Y 发表于 2025-2-13 08:54
原来如此,这里已经蒙圈了。FoldFragment1只是放音频的, 没用, 所以直接看FoldFragment2
vcyi 发表于 2025-2-13 09:28
谢谢分享
dongye 发表于 2025-2-13 10:56
你用的IDA是什么版本的,有插件么,我用论坛里的发现反编译出来的C代码函数没有参数,汇编里才能看到
 楼主| Command 发表于 2025-2-13 11:05
dongye 发表于 2025-2-13 10:56
你用的IDA是什么版本的,有插件么,我用论坛里的发现反编译出来的C代码函数没有参数,汇编里才能看到

我一开始反编译出来也没参数, 后来我Set call type手动加的
LONG65041 发表于 2025-2-13 11:20
明年看我的!!!
dongye 发表于 2025-2-13 11:33
Command 发表于 2025-2-13 11:05
我一开始反编译出来也没参数, 后来我Set call type手动加的

我的看着有很多 HIDWORD,LOBYTE之类的东西这个是需要修改什么东西才会正常显示么
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-4-1 09:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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