吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2768|回复: 12
收起左侧

[CTF] [2023春节]Windows、Android初级题

[复制链接]
lu_ 发表于 2023-2-6 11:42
本帖最后由 lu_ 于 2023-2-6 18:37 编辑

一、Windows初级题

新手题用了三天才误打误撞完成了,惭愧惭愧

接下来进入正题

第一步先查壳

pSNG0zV.md.png

没有壳,先跑起来看一下,可以看到有长度检测

pSNGsLF.md.png

拖入OD,搜索字符串,发现tips和错误提示

Tips:same like last year question

好家伙,那不就是2023HappyNewYear52PoJie呗,然而并不是

pSNGIsO.png

双击Length Error

004012D7   .  C70424 000044>mov dword ptr ss:[esp],【2023春.00440000   ; |【2023春节】解题领红包之贰
004012F4   .  B8 1B004400   mov eax,【2023春.0044001B                  ;  Please input password:
004012F9   .  894424 04     mov dword ptr ss:[esp+0x4],eax
004012FD   .  C70424 D03344>mov dword ptr ss:[esp],【2023春.004433D0
00401304   .  C745 98 05000>mov dword ptr ss:[ebp-0x68],0x5
0040130B   .  E8 E0B00300   call 【2023春.0043C3F0
00401310   .  890424        mov dword ptr ss:[esp],eax
00401313   .  E8 A89E0300   call 【2023春.0043B1C0
00401318   .  C70424 703444>mov dword ptr ss:[esp],【2023春.00443470   ;  |D
0040131F   .  8D5D D8       lea ebx,dword ptr ss:[ebp-0x28]
00401322   .  895C24 04     mov dword ptr ss:[esp+0x4],ebx
00401326   .  E8 45C40300   call 【2023春.0043D770
0040132B   .  8B75 D8       mov esi,dword ptr ss:[ebp-0x28]
0040132E      837E F4 1D    cmp dword ptr ds:[esi-0xC],0x1D
00401332   .  0F84 A5000000 je 【2023春.004013DD
00401338   .  C70424 D03344>mov dword ptr ss:[esp],【2023春.004433D0
0040133F   .  BF 34004400   mov edi,【2023春.00440034                  ;  Length Error, please try again

可以看到上面有一个比较cmp dword ptr ds:[esi-0xC],0x1D

虽然看不懂,但是看了大佬去年的解题过程,得知这应该是判断长度的。0x1D转为10进制是29,经过验证,flag长度确实是29

接下来,便没有了思路,去年的题目flag直接出现在寄存器中。我照着教程https://www.52pojie.cn/forum.php?mod=viewthread&tid=1588529怎么也找不到

试过IDA,伪代码硬是看不懂,不过我发现第三个call就只有一处调用,就跟进去看了一下

pSNYZ4A.png

pSNYKjf.png

下断点,跑起来然后单步进入

返回后,发现有个跳转会跳到失败,看到过教程里说可以修改Z 标志位不让它跳转,继续单步往下走

pSNtnIJ.png

又一个jnz,不让它跳,渐渐发现这是一个循环,大概是取出每一个字符进行比较,后来想到是flag开头,结合Tipsflag{2023HappyNewYear52PoJie} 结果还不对,没办法多走几步,发现52PoJie在前面flag{52PoJie2023HappyNewYear}

pSNtcdg.png

没学过逆向,把题解出来成就感还是不错的: )

二、Android 初级题一

安装好,打开看一下,有一个按钮,点击999次就能获得flag

这就打开连点器 (

按一下按钮就会发出鸡叫

pSNNBtJ.md.jpg

用MT提取apk,没有加固

接着xml搜索 点击,复制id,在dex中搜索

pSNNo9A.md.jpgpSNN5hd.md.jpg

pSNNW7D.md.jpg

进入MainActivity,转成java,关键在于check函数

  public static final void onCreate$lambda-0(MainActivity mainActivity, TextView textView, View view) {
        Intrinsics.checkNotNullParameter(mainActivity, "this$0");
        Intrinsics.checkNotNullParameter(textView, "$key");
        Context context = (Context) mainActivity;
        mainActivity.jntm(context);
        textView.setText(String.valueOf(mainActivity.num));
        if (mainActivity.check() == 999) {
            Toast.makeText(context, "快去论坛领CB吧!", 1).show();
            textView.setText(mainActivity.decrypt("hnci}|jwfclkczkppkcpmwckng\u007f", 2));
        }
    }

直接返回999

[pSNNhAe.md.jpg

点击一下,成功得到flag

pSNNR0O.md.jpg

三、Android 初级题二

要求输入UIDflag

如上搜索验证后,判断发生在MainActivity

用Jadx打开,定位到MainActivity,有一个关于按钮的校验,在动态调试时,按钮会不可见

public void onStart() {
        super.onStart();
        if (b()) {
            return;
        }
        Button button = this.btn_check;
        if (button == null) {
            Intrinsics.throwUninitializedPropertyAccessException("btn_check");
            button = null;
        }
        button.setVisibility(8);
    }

    private final boolean b() {
        String str;
        Signature[] signatureArr;
        try {
            if (Build.VERSION.SDK_INT >= 28) {
                signatureArr = getPackageManager().getPackageInfo(getPackageName(), 134217728).signingInfo.getApkContentsSigners();
            } else {
                signatureArr = getPackageManager().getPackageInfo(getPackageName(), 64).signatures;
            }
            str = MD5Utils.INSTANCE.MD5(Base64Utils.INSTANCE.encodeToString(signatureArr[0].toByteArray()));
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            str = "";
        }
        return Intrinsics.areEqual("12178c3f7f6b734a8a3d0ace3092bd32", str);
    }

判断flag是否正确,判断逻辑在a.B

public static final void m25onCreate$lambda0(MainActivity this$0, View view) {
        Intrinsics.checkNotNullParameter(this$0, "this$0");
        A a = A.INSTANCE;
        EditText editText = this$0.edit_uid;
        EditText editText2 = null;
        if (editText == null) {
            Intrinsics.throwUninitializedPropertyAccessException("edit_uid");
            editText = null;
        }
        String obj = StringsKt.trim((CharSequence) editText.getText().toString()).toString();
        EditText editText3 = this$0.edit_flag;
        if (editText3 == null) {
            Intrinsics.throwUninitializedPropertyAccessException("edit_flag");
        } else {
            editText2 = editText3;
        }
        if (a.B(obj, StringsKt.trim((CharSequence) editText2.getText().toString()).toString())) {
            Toast.makeText(this$0, "恭喜你,flag正确!", 1).show();
        } else {
            Toast.makeText(this$0, "flag错误哦,再想想!", 1).show();
        }
    }

定位到B方法,可以看出是flag{}的形式

// str:UID  str:flag
    public final boolean B(String str, String str2) {
        Intrinsics.checkNotNullParameter(str, "str");
        Intrinsics.checkNotNullParameter(str2, "str2");
        if (!(str.length() == 0 && str2.length() == 0) && StringsKt.startsWith$default(str2, "flag{", false, 2, (Object) null) && StringsKt.endsWith$default(str2, "}", false, 2, (Object) null)) {
            String substring = str2.substring(5, str2.length() - 1);
            Intrinsics.checkNotNullExpressionValue(substring, "this as java.lang.String…ing(startIndex, endIndex)");
            C c = C.INSTANCE;
            MD5Utils mD5Utils = MD5Utils.INSTANCE;
            Base64Utils base64Utils = Base64Utils.INSTANCE;
            String encode = B.encode(str + "Wuaipojie2023");
            Intrinsics.checkNotNullExpressionValue(encode, "encode(str3)");
            byte[] bytes = encode.getBytes(Charsets.UTF_8);
            Intrinsics.checkNotNullExpressionValue(bytes, "this as java.lang.String).getBytes(charset)");
            return Intrinsics.areEqual(substring, c.cipher(mD5Utils.MD5(base64Utils.encodeToString(bytes)), 5));
        }
        return false;
    }

太多了,不想看,直接上jeb动态调试,具体看正己哥哥的教程

[吾爱破解安卓逆向入门教程《安卓逆向这档事》

给b方法赋值,防止按扭消失

pSNr3QJ.md.jpg

找到B方法,下断

pSNrLkV.md.png

输入UIDflag,验证。成功断下,查看变量,发现flag

96382gjk7f53h2f97jifi1hfhgg9ggjkflag{}包裹

pSNrbT0.png

flag正确

pSNrIyj.md.jpg

web初级题

虽然没解出来,记录一下不知道对不对

flag6

第一个是flag6,通过拨号音识别数字

https://xiangyuecn.github.io/Recorder/assets/%E5%B7%A5%E5%85%B7-%E4%BB%A3%E7%A0%81%E8%BF%90%E8%A1%8C%E5%92%8C%E9%9D%99%E6%80%81%E5%88%86%E5%8F%91Runtime.html?jsname=teach.dtmf.decode_and_encode

pSaoJiD.png

flag6{590124}这是我识别出来的,特意拿手机按了一下,好像差不多

flag1

第二flag1,最简单

pSaoNzd.png

flag1{52pojiehappynewyear}

flag2

第三flag2,扫码就能获得,跟在url后面

pSaoyFS.png

flag2{878a48f2}

flagC

第四,视频中给出了一个地址2023challenge.52pojie.cn,并给出提醒与域名解析有关,添加hosts

pSaocWQ.png

成功打开

pSaTwp4.png

点击登录,一个input,现在是禁用的,打开developer tools删除disabled,输入uid,提交

pSaT01J.png

哦吼吼,没这么简单

您不是 admin,你没有权限获取 flag

简单查看了一下源代码,并没有发现js文件,查看请求就只有cookie中的2023_challenge_jwt_token有点可疑,是jwt加密

来到https://jwt.io/解密

得到了

 { "uid": "906217",
  "role": "user"
}

user改为admin

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiI5MDYyMTciLCJyb2xlIjoiYWRtaW4ifQ.0n-chadlC7wCWuUvGid_9qBtO0G91IplcrNWgP-_Jpg

复制后修改cookie,方法就不赘述了,刷新,成功得到flagC。静态还没找到几个就给一个动态的 (悲

欢迎,admin。您的 flag 是 flagC{f1d40424},过期时间是 2023-01-29T14:50:00+08:00

flag7

第五,一筹莫展之际网页查看源代码发现了新的线索

 const FLAG_LINE_A = '|01 1 001 1 001 1 01 1 0001 1 00001 01 1 001 1 1 001 1 0111 011 1 101100 1 1 0 10 1 011 0 01 0000 1 10000 001 1 01 1 0 011 0 00 10 011 0 010 100 1 1011 000 1 1 0 0 11 01111101==========|'; // 这里面藏着两个 flag 哦~
 const FLAG_LINE_B = '|++++++++++[>++++++++++>++++++++++>+++++>++++++++++++<<<<-]>++.++++++.>---.<-----.>>-..>+++.<+++++.---.+.---.+++++++.<+++.+.>-.>++.|';
 const FLAG_LINE_A2 = FLAG_LINE_A.replaceAll(' ', '');
 const FLAG_LINE_A_PARTS = Array.from(FLAG_LINE_A.matchAll(/. ?/g));

<!-- 提示:你可以去 DNS 中寻找一些信息 -->

dns是124.232.185.97,看不出什么名堂

FLAG_LINE_A是一串二进制,https://www.binaryhexconverter.com/binary-to-ascii-text-converter       解码得到了flag7{5d06be63},两个只发现1个。呜呜

flag11

FLAG_LINE_B看不懂就拿去百度了,发现这是BrainFuck,通过https://www.nayuki.io/page/brainfuck-interpreter-javascript解码得到了flag11{63418de7}

flag4

本来已经放弃了,看到视频的创作团队点进了出题人的空间发现代码ZmxhZzR7OWNiOTExMTd9 base64解码得到flag4{9cb91117}

一些猜测

视频中有一段摩斯电码

背景应该有线索

视频结尾不知道在念什么

免费评分

参与人数 3威望 +1 吾爱币 +24 热心值 +3 收起 理由
你好,再见 + 3 + 1 我很赞同!
MYPcodcsja + 1 + 1 用心讨论,共获提升!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

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

高锰酸钾 发表于 2023-2-6 21:46
本帖最后由 高锰酸钾 于 2023-2-6 21:54 编辑

初级这里有个简单的方法,就是楼主最后一张图00401417      381C32        cmp byte ptr ds:[edx+esi],b 这个位置,将cmp 改成mov,就会看到正确的flag慢慢替换掉你错误的flag。当然下面那句jnz要改成jz。这样你输入的29个1就变成正确flag了。
头像被屏蔽
墨玫醉 发表于 2023-2-6 11:45
ytfrdfiw 发表于 2023-2-6 11:59
ck6102 发表于 2023-2-6 13:20
感谢分享。学习!
o824 发表于 2023-2-6 13:50
感谢分享!学习。
cscscscs 发表于 2023-2-6 15:25
感谢大佬分享,虽然是眼睛会大脑不会
15170256641 发表于 2023-2-6 16:59
感谢分享,学习
gunxsword 发表于 2023-2-6 18:06
那个FLAG4,找了半天没找到,哎,眼神不够用啊!
CrushIndex 发表于 2023-2-6 22:00
厉害了,受教
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-12-23 23:58

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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