吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1398|回复: 10
收起左侧

[CTF] 【2025春节】解题领红包初级题(windows + android)

[复制链接]
geesehoward 发表于 2025-2-14 17:11
本帖最后由 geesehoward 于 2025-2-14 17:24 编辑

一、windows初级题

初级题,100%应该不会有壳,先运行起来随便输入,看看报什么错误
1.png

搜一下x32dbg重新启动程序并搜索字符串
2.png

前面有一个je,前面还有一个cmp esi edi,在次下断点并运行,esi的值是6,edi的值是1B(27),显然不等,将je改为jne,继续运行
3.png

不停的向下跟,一个27次的循环结束后,flag会出现在ebp-40的地址里,后面会被复制给ECX
5.png

至此,flag已经找到了,复制输入,成功!
6.png

其实这个程序是先检查字符串长度是否为27,然后再将6b83537e8a30477b3e59362e4c293535340c5b5a5c797f5073747e进行计算,还原成答案,与输入进行比对,如果换成用输入反向计算去与目标字符串比对,难度无疑对新手不太友好。

flag是按位加算的,写成C代码逻辑如下
[C] 纯文本查看 复制代码
int main(int argc, char** argv)
{
    unsigned char encFlag[] = {
          0x6b, 0x83, 0x53, 0x7e, 0x8a, 0x30, 0x47, 0x7b
        , 0x3e, 0x59, 0x36, 0x2e, 0x4c, 0x29, 0x35, 0x35
        , 0x34, 0x0c, 0x5b, 0x5a, 0x5c, 0x79, 0x7f, 0x50
        , 0x73, 0x74, 0x7e 
    };
    unsigned char flag[28] = { 0 };
    int edx = 0x7e9;//2025
    int v90 = 0x80000000;
    for (int i = 0; i < 27; i++)
    {
        int eax = (0x41C64E6D * edx + 0x1E240) % (int)v90;
        edx = eax;
        long long tmp = (long long)eax * 0x4ec4ec4f;
        eax = (tmp >> 32) & 0xFFFFFFFF;
        eax = eax >> 3;
        eax = ((eax + ((unsigned int)eax >> 0x1F)) & 0xff) * 0x1A;
        flag[i] = encFlag[i] + ((eax & 0xFF) - (edx & 0xFF)) & 0xFF;
    }
 
    printf("%s\n", flag);
}


二、Android初级题

往年红包只玩windows和web,今年web题少,心血来潮发现工具不足啊。

初级题先试试手吧

首先,apk拖入jadx,查找个人代码部分,发现有两个FoldFragment,FoldFragment1在播放三折叠的宣传MP3,没有连个字符串都没有。文本打开mp3,也没有flag。目标转向FoldFragment2,代码里发现了3个base64的字符串,使用的地方都用同一个接口去解码,直接复制在线解码,发现不是明文。调用接口跟进去发现是xxtea加解密,正己大神还贴心的把加密接口也写进去了。

跟踪接口调用并整理的到如下Java代码
[Java] 纯文本查看 复制代码
import java.io.IOException;
 
import sun.misc.BASE64Decoder;
 
public class calcFlag {
        private static String YYLX = "my-xxtea-secret";
        private static String m7483db(String value) throws IOException {
            BASE64Decoder decoder = new BASE64Decoder();
        byte[] decode = decoder.decodeBuffer(value);
        byte[] bytes = YYLX.getBytes("UTF-8");
        String retStr = new String(m7488de(decode, bytes), "UTF-8");
        return retStr;
    }
 
        private static byte[] m7488de(byte[] data, byte[] key) {
        return data.length == 0 ? data : toByteArray(m7487de(toIntArray(data, false), toIntArray(m7484fK(key), false)), true);
    }
 
    static int[] m7487de(int[] iArr, int[] iArr2) {
        int length = iArr.length;
        int i = length - 1;
        if (i < 1) {
            return iArr;
        }
        int i2 = iArr[0];
        for (int i3 = ((52 / length) + 6) * (-1640531527); i3 != 0; i3 -= -1640531527) {
            int i4 = (i3 >>> 2) & 3;
            for (int i5 = i; i5 > 0; i5--) {
                int i6 = iArr[i5 - 1];
                i2 = iArr[i5] - (((i2 ^ i3) + (i6 ^ iArr2[(i5 & 3) ^ i4])) ^ (((i6 >>> 5) ^ (i2 << 2)) + ((i2 >>> 3) ^ (i6 << 4))));
                iArr[i5] = i2;
            }
            int i7 = iArr[i];
            i2 = iArr[0] - (((i2 ^ i3) + (iArr2[i4] ^ i7)) ^ (((i7 >>> 5) ^ (i2 << 2)) + ((i2 >>> 3) ^ (i7 << 4))));
            iArr[0] = i2;
        }
        return iArr;
    }
 
    static int[] toIntArray(byte[] bArr, boolean z) {
        int length = (bArr.length + 3) / 4;
        int[] iArr = new int[length + (z ? 1 : 0)];
        int length2 = bArr.length;
        for (int i = 0; i < length2; i++) {
            int i2 = i / 4;
            iArr[i2] = iArr[i2] | ((bArr[i] & 0xFF) << ((i % 4) * 8));
        }
        if (z) {
            iArr[length] = bArr.length;
        }
        return iArr;
    }
 
    private static byte[] toByteArray(int[] iArr, boolean z) {
        int length = iArr.length * 4;
        if (z) {
            length = iArr[iArr.length - 1];
        }
        byte[] bArr = new byte[length];
        for (int i = 0; i < length; i++) {
            bArr[i] = (byte) ((iArr[i / 4] >> ((i % 4) * 8)) & 255);
        }
        return bArr;
    }
 
    private static byte[] m7484fK(byte[] bArr) {
        byte[] bArr2 = new byte[16];
        System.arraycopy(bArr, 0, bArr2, 0, bArr.length > 16?16:bArr.length);
        return bArr2;
    }
    
        public static void main(String[] args) throws IOException {
                // TODO Auto-generated method stub
                String flag = m7483db("2hyWtSLN69+QWLHQ");
                String flag2 = m7483db("hjyaQ8jNSdp+mZic7Kdtyw==");
                System.out.println(flag + flag2);
        }
 
}


flag拼接方法是因为试过了知道怎么用才这么写的,直接调用三次分别解三个更全面。

免费评分

参与人数 3威望 +1 吾爱币 +22 热心值 +2 收起 理由
ZXH888 + 1 + 1 我很赞同!
蔷薇的羽翼 + 1 我很赞同!
云在天 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

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

fuliyan2010 发表于 2025-2-14 19:58

感谢分享
zach14c 发表于 2025-2-14 23:08
lroyle 发表于 2025-2-14 23:36
gegegefei 发表于 2025-2-15 06:50
感谢楼主分享,刚刚看到这个,学习一下。
小职boy 发表于 2025-2-15 12:10
支持大佬,感谢大佬分享
jiuren2021 发表于 2025-2-15 12:21

支持大佬,感谢大佬分享
WRZ93 发表于 2025-2-15 14:29
感谢分享
Taylor20200522 发表于 2025-2-15 19:09
感谢分享,学习一下
xinfa 发表于 2025-2-16 02:42

感谢分享,学习一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-6-17 04:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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