吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2560|回复: 9
收起左侧

[CTF] 【2024春节】解题领红包部分 WP

[复制链接]
我是不会改名的 发表于 2024-2-25 00:06

Windows 初级

fl@g{H@ppy_N3w_e@r!2o24!Fighting!!!}

#include <iostream>
int main() {
    char data[] = "ioCj~KCss|bQ6zbhCu$5r57$Iljkwlqj$$$\x80";
    char* ptr = (char*)data;
    while (*ptr != '\0') {
        *ptr = *ptr - 3;
        ptr++;
    }
    std::cout << data << std::endl;
    return 0;
}

安卓初级

flag{happy_new_year_2024}

修改一下 AndroidManifest.xml 对应activity android:exported 改成true然后重新安装

        <activity android:name="com.zj.wuaipojie2024_1.YSQDActivity" android:exported="true" android:screenOrientation="landscape" android:configChanges="screenSize|orientation|keyboardHidden"/>

adb直接启动,视频播放结束后会出现flag

adb shell am start -n com.zj.wuaipojie2024_1/com.zj.wuaipojie2024_1.YSQDActivity

实际上藏在视频末尾

1.png

安卓初级

flag{52pj_HappyNewYear2024}

直接adb启动

adb shell am start -n com.kbtx.redpack_simple/com.kbtx.redpack_simple.FlagActivity

主要是签名效验,如果修改了签名,还原出来可能乱码

public class FlagActivity extends h {
    public static byte[] o = {86, -18, 98, 103, 75, -73, 51, -104, 104, 94, 73, 81, 125, 118, 112, 100, -29, 63, -33, -110, 108, 115, 51, 59, 55, 52, 77};
    public void onCreate(Bundle bundle) {
        byte[] bArr;
        Signature[] signatureArr;
        super.onCreate(bundle);
        setContentView(R.layout.activity_flag);
        byte[] bArr2 = o;
        try {
            signatureArr = getPackageManager().getPackageInfo(getPackageName(), 64).signatures;
        } catch (PackageManager.NameNotFoundException unused) {
            bArr = new byte[0];
        }
        if (signatureArr != null && signatureArr.length >= 1) {
            byte[] byteArray = signatureArr[0].toByteArray();
            ByteBuffer allocate = ByteBuffer.allocate(bArr2.length);
            for (int i = 0; i < bArr2.length; i++) {
                allocate.put((byte) (bArr2[i] ^ byteArray[i % byteArray.length]));
            }
            bArr = allocate.array();
            StringBuilder d = a.d("for honest players only: \n");
            d.append(new String(bArr));
            ((TextView) findViewById(R.id.tvFlagHint)).setText(d.toString());
        }
    }
}

直接提取出CERT.RSA,修改后缀为p7b,双击导出证书

2.png

public class cj {
    public static String CertString  ="MIIDADCCAegCAQEwDQYJKoZIhvcNAQELBQAwRjEQMA4GA1UEAwwHa2J0eHdlcjEQ" +
            "MA4GA1UECwwHNTJwb2ppZTEQMA4GA1UECgwHNTJwb2ppZTEOMAwGA1UEBwwFQ2hp" +
            "bmEwHhcNMjQwMTE2MDYzMzIzWhcNNDkwMTA5MDYzMzIzWjBGMRAwDgYDVQQDDAdr" +
            "YnR4d2VyMRAwDgYDVQQLDAc1MnBvamllMRAwDgYDVQQKDAc1MnBvamllMQ4wDAYD" +
            "VQQHDAVDaGluYTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIBIBBNf" +
            "V8FTmAmp9ikd0NqDxfn8V8rxmaSM/je5oMxGoQUhMqY0TjCaMbgO5xXf/L0gf4Sw" +
            "fmIMi8MjKwkwUEc/gp7LdKVF7o/UKf6uhIDkKEw1vGncQ9PBMOv3sKFsbRCFdhPC" +
            "JCAq53Em/P3JZCFEFYKH/noZaWO8UqR7uULw916wWSNr+mTFJxjHNUekw2LxF07G" +
            "QrmKMaTXy+jpkd+ifbcANdRRyHm13vEtu32xn9WrIREQJWxBVs0L5z0i0sBgMUTe" +
            "oY5lehLAwBRrpcXrprlzoie4FfyO/tTEonVHcYVL08BEaG7L5lBaVA56+qCZkzlB" +
            "C1qf64JkB0UsKIsCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAXhAk7ZWZLNjYgzTq" +
            "82D9VpntfSMzY03e1l6c2mIiu1rmgYnbavtYmMqfNDeVnbLlDObRn8O5gu3n6e1d" +
            "2SSI3tZpKK1ZOf3zGLF7SpXwIFu22iej3k97aXANlKJegHZ9JWtjABTiVGSLKjfW" +
            "iZWe9HKTp3LBUJ2zGw3e03eWT+kzZtjvgI4gfRsji7vVG2odODMODCm+4a/dBnTl" +
            "ADtM0lVdJaDPUj8ReR0ql/99EyNUMv7wtE+3o0xpCrUd5NVLp4doEusfaRnSvS35" +
            "fDfp6SfODQ9BqE9TPgEPyOGn+iA8HHw+XQhzsrn8bNdNnlOBMsbXJcMFvF92Cw+4" +
            "cQGoog==";
    public static byte[] o = {86, -18, 98, 103, 75, -73, 51, -104, 104, 94, 73, 81, 125, 118, 112, 100, -29, 63, -33, -110, 108, 115, 51, 59, 55, 52, 77};
    public static void main(String[] args) {
        byte[] Flag = new byte[o.length];
        byte[] publicKeyBytes = Base64.getDecoder().decode(CertString);
        for (int i = 0; i < o.length; i++) {
            Flag[i] = (byte) (o[i] ^ publicKeyBytes[i%publicKeyBytes.length]);
        }
        System.out.println(new String(Flag));
    }
}

安卓中级

简直就是终极谜语人

没啥好分析的

根据他的逻辑(完全没有逻辑)走,建议使用as或其他软件查看日志帮助调试。

首先需要手动修复classes.dex,建议使用np只修复文件头,这里建议使用frida或其他去hook文件读写,避免签名效验。

            InputStream open = getAssets().open("classes.dex");
            byte[] bArr = new byte[open.available()];
            open.read(bArr);
            File file = new File(getDir("data", 0), "1.dex");

手动复制文件1.dex修改为decode.dex,同目录/data/user/0/com.zj.wuaipojie2024_2/app_data/

    private static ByteBuffer read(Context context) {
        try {
            File file = new File(context.getDir("data", 0), "decode.dex");
            if (file.exists()) {
                FileInputStream fileInputStream = new FileInputStream(file);
                byte[] bArr = new byte[fileInputStream.available()];
                fileInputStream.read(bArr);
                ByteBuffer wrap = ByteBuffer.wrap(bArr);
                fileInputStream.close();
                return wrap;
            }
            return null;
        } catch (Exception unused) {
            return null;
        }
    }

hook掉文件删除,主要删除了修复好了的2.dex

            fix.delete();
            new File(dir, fix.getName()).delete();

根据提示,还要修复B.D,hook这里修改为B的偏移,同时修改2.dex为decode.dex

getResources().getIntArray(R.array.A_offset)// int A_offset = 0x7f030000;int B_offset = 0x7f030001;

两次修复了就能看到完整代码了

3.png

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class zj {
    static String UID = "1372193";
    public static void main(String[] args) {
        String password=GetPassword();
        String password_uid=password+UID;
        byte[] bArr = password_uid.getBytes();
        byte[] sha1 = GetSha1(bArr);
        String md5 = GetMd5(sha1);
        System.out.println("机缘是"+md5);
    }
    public static byte[] GetSha1(byte[] bArr) {
        try {
            return MessageDigest.getInstance("SHA-1").digest(bArr);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }
    public static String GetMd5(byte[] bArr) {
        try {
            MessageDigest instance = MessageDigest.getInstance("MD5");
            instance.update(bArr);
            byte[] digest = instance.digest();
            StringBuffer stringBuffer = new StringBuffer();
            for (byte b : digest) {
                stringBuffer.append(Integer.toHexString((b & 255) | 256).substring(1, 3));
            }
            return stringBuffer.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }
    public static String GetPassword() {
        StringBuffer stringBuffer = new StringBuffer();
        int i = 0;
        while (stringBuffer.length() < 9 && i < 40) {
            int i2 = i + 1;
            String substring = "0485312670fb07047ebd2f19b91e1c5f".substring(i, i2);
            if (!stringBuffer.toString().contains(substring)) {
                stringBuffer.append(substring);
            }
            i = i2;
        }
        return stringBuffer.toString();
    }
}

win高级

没做出来只做记录,学会了再来

客户端 upx 脱壳参考 x64dbg手脱64位程序upx3.96壳后修复,主要是

sub_140001CF0(uid, flag) //分别传入了int uid 和 char *flag

避免每次都去手动输入使用frida调用

frida  crackme2024g_dump_SCY.exe 

var sub_140001CF0 = new NativeFunction(ptr(0x140001CF0), 'int64', ['int64', 'pointer']);
var uid = 1372193;
console.log(sub_140001CF0(uid, Memory.allocUtf8String("12345678-56789ABC-9ABDEF0C-12345678=")));

服务端Themida壳,看不懂,找了个现成的https://github.com/bobalkkagi/bobalkkagi

只找了部分对应函数,能力有限看不懂做了啥

401360 verify (ppv a1,bool *a2)//成功后给a2赋值

4012B0 set_flag(ppv a1,char *a2)

401280 set_uid(ppv a1,int *a2)

安卓高级

没做出来只做记录,学会了再来

因为只有arm64的so,真机刷废了,新的还没买,所以只有用unidbg跑

利用unidbg先知道函数地址

RegisterNative(com/wuaipojie/crackme2024/MainActivity, checkSn([BLjava/lang/String;)Z, RX@0x4001befc[lib52pojie.so]0x1befc)

4.png

可以看见大部分都是间接跳转,参考 记一次基于unidbg模拟执行的去除ollvm混淆 来还原部分,需要注意的是并不完全一样,不一定寄存器全部相同,建议直接遍历。

第一次还原后,仍有很多看不懂,参考往年[2022春节】解题领红包WPwp

5.png

首先把.bss段patch 0,参考周易大佬的 https://www.52pojie.cn/forum.php?mod=redirect&goto=findpost&ptid=1742334&pid=45551435,修改下就行

import ida_bytes
import ida_idaapi
import ida_xref
import struct

def do_patch(ea):
    if ida_bytes.get_bytes(ea + 3, 1) == b"\xB9":
        reg = ord(ida_bytes.get_bytes(ea, 1)) & 0b00011111
        ida_bytes.patch_bytes(ea, struct.pack("<I", (0x4A000000 | (reg << 16) | (reg << 5) | reg)))
        print("PATCH@{:016X}".format(ea))
    else:
        print("ERROR@{:016X}".format(ea))
start = 0x0000000000059CC0
end = 0x000000000005A250

for addr in range(start, end, 4):
    print("=={:016X}==".format(addr))
    ref = ida_xref.get_first_dref_to(addr)
    while ref != ida_idaapi.BADADDR:
        if 0x000000000000D5C0 <= ref < 0x000000000004D21C:
            do_patch(ref)
        ref = ida_xref.get_next_dref_to(addr, ref)
    print("=" * 20)59DB4

然后吧.data设置只读

形如MOV             W9, #(off_55398 - 0xFFFFFFFF86761E84),的鼠标点击一下,按下Q MOV             W9, #0x798F3514

大部分还是勉强可以阅读了

6.png

首先获取输入md5后uid的字节长度,判断是否是16

              v35 = sub_1DFE0(a1, v32);
              v7 = v33 + 1548783866;
              if ( v35 == 16 )
                v7 = v33 + 949588317;

__int64 __fastcall sub_1DFE0(JNIEnv *a1)
{
  return ((*a1)->GetArrayLength)(a1);
}

然后是读取输入,以及判断某个东西

      v11 = v32;
      v12 = sub_1E02C(a1, v32, v5);//GetByteArrayElements
      v36 = &v22;
      v22 = 0uLL;
      v37 = &v22;
      v22 = *v12;
      sub_1E0DC(a1, v11, v12, 0);//ReleaseByteArrayElements
      v38 = sub_1E1A0(a1, v31, 0LL);//GetStringUTFChars
      v24 = v33 + 1056209953;
      v13 = sub_1E24C(&v24);
      v7 = v33 - 783467553;
      v5 = v28;
      if ( (v13 & 1) == 0 )
        v7 = v33 - 2063012219;

第一次trace就结束了,只有几千行就退出了

根据上面内容判断sub_1E24C函数返回值,走不同分支,根据trace代码,hook一下部分函数

        int ptrs[]={0x1E924,0x23D8C,0x21260,0x217f8,0x23f28,0x219cc,0x21c34,0x21020};
        for(int ptr:ptrs)
        {
            addHook(ptr);
        }
public void addHook(int address) {
    emulator.attach().addBreakPoint(module.base + address, new BreakPointCallback() {
        @Override
        public boolean onHit(Emulator<?> emulator, long address) {
            RegisterContext context = emulator.getContext();
            System.out.println("addBreakPoint: 0x" + Long.toHexString(address) + ", LR=" + context.getLRPointer());
            for (int i = 0; i < 3; i++) {
                try {
                    Inspector.inspect(context.getPointerArg(i).getByteArray(0, 16), "bytes");
                } catch (Exception e) {
                    System.out.println(context.getLongArg(i));
                }
            }
            return true;
        }

    });

}

可以看出来主要检测adb ,通过init.svc.adbd判断running,其余作用没看出来,直接hook

7.png

emulator.attach().addBreakPoint(module.base + 0x1E24C, new BreakPointCallback() {
    @Override
    public boolean onHit(Emulator<?> emulator, long address) {
        RegisterContext context = emulator.getContext();
        emulator.getBackend().reg_write(Arm64Const.UC_ARM64_REG_PC, context.getLRPointer().peer);
        emulator.getBackend().reg_write(Arm64Const.UC_ARM64_REG_X0, 0);
        return true;
    }
});

然后他就崩了,在1E924函数里面,根据某位大佬提示,这里面就核心部分,主要涉及签名以及flag,但是手上没手机调试不了,也没看出为啥崩了

    v24 = sub_1E924(v31, v50, v22, v20, v26);
    v8 = v41;
    v5 = v38;
    v6 = v39;
    v9 = v43 + 2021858523;
    if ( !v24 )
      v9 = v43 - 1030713484;

通样的这里根据不同返回值走不同分支

emulator.attach().addBreakPoint(module.base + 0x1E24C, new BreakPointCallback() {
    @Override
    public boolean onHit(Emulator<?> emulator, long address) {
        RegisterContext context = emulator.getContext();
        emulator.getBackend().reg_write(Arm64Const.UC_ARM64_REG_PC, context.getLRPointer().peer);
        emulator.getBackend().reg_write(Arm64Const.UC_ARM64_REG_X0, 0);
        return true;
    }
});

同样的操作,可以看到这次主函数基本跳转至少是还原了

8.png

在子函数里面还有一种,通过传递常量,来跳转,不多,直接手动就行,也可以自动,不过没啥明显特征,就是多了几个add

9.png

根据trace代码基本可以判断大致逻辑了,接着上面的读取了md5(uid)和flag

先base64解码flag

        v49 = v6;
        v50 = sub_24290(v48, v44, v6);
        (sub_1E85C)(a1, v8, v48);
        v8 = v41;
        if ( v50 )
          v9 = v43 + 1818917099;
        else
          v9 = v43 - 1972945260;

然后进行一系列运算

sub_1E924(v31, v50, v22, v20, v26)

然后对比md5(uid)和解密后的flag

          v19 = sub_21020(v31, v53, v47, v45);//xor
          v8 = v41;
          v5 = v38;
          v36 = v19 == 0;
emulator.attach().addBreakPoint(module.base + 0x21020,new BreakPointCallback() {
    @Override
    public boolean onHit(Emulator<?> emulator, long address) {
        RegisterContext context = emulator.getContext();
        int x0 = context.getIntArg(0);
        System.out.println("x0: " + x0);
        Pointer pointer1 = context.getPointerArg(1);
        byte[] bytes1 = pointer1.getByteArray(0, 16);
        Inspector.inspect(bytes1, "bytes");
        Pointer pointer2 = context.getPointerArg(2);
        byte[] bytes2 = pointer2.getByteArray(0, 16);
        Inspector.inspect(bytes2, "bytes");
        int x3 = context.getIntArg(3);
        System.out.println("x3: " + x3);
        //emulator.getBackend().reg_write(Arm64Const.UC_ARM64_REG_PC, context.getLRPointer().peer);
        //emulator.getBackend().reg_write(Arm64Const.UC_ARM64_REG_X0, 0);
        return true;
    }
});

能力有限搞不定sub_1E924函数,等大佬来。

web

初级

flag1{52pj2024}视频开头
flag3{GRsgk2}  视频开头

flag2{xHOpRP} 扫描二维码重定向

10.png

flag4{YvJZNS}  打开网站加载了图片flag4_flag10.png直接下载下来,或者浏览器改成黑暗模式

11.png

flagA 

登录的时候,返回了加密flag, 然后又请求了一个地址,返回了uid,uid和flag格式类似,猜测加密算法一样,所以直接修改uid

12.png

import requests

headers = {
    "Accept": "*/*",
    "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
    "Cache-Control": "no-cache",
    "Connection": "keep-alive",
    "Pragma": "no-cache",
    "Referer": "https://2024challenge.52pojie.cn/index.html",
    "Sec-Fetch-Dest": "empty",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "same-origin",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
    "sec-ch-ua": "\"Microsoft Edge\";v=\"119\", \"Chromium\";v=\"119\", \"Not?A_Brand\";v=\"24\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\""
}
cookies = {
    "Hm_lvt_46d556462595ed05e05f009cdafff31a": "1708659720,1708672297,1708674684,1708680758",
    "wzws_sessionid": "gDExMC4xOTEuMTA2LjE1MoFjMDJmY2GgZdhm5YJmOTJkYmM=",
    "Hm_lpvt_46d556462595ed05e05f009cdafff31a": "1708681305",
    "uid": "Gd4Tluu3chgIlI4T05GgaCKkkj1Kq1hHC687aNvWDXYZYV0jIGKuBDUTUg==",
    "flagA": "Gd4Tluu3chgIlI4T05GgaCKkkj1Kq1hHC687aNvWDXYZYV0jIGKuBDUTUg=="
}
url = "https://2024challenge.52pojie.cn/auth/uid"
response = requests.get(url, headers=headers, cookies=cookies)

print(response.text)
//flagA{55dd466e}

中级

flag5{P3prqF} -flag9{KHTALK}网页源码中有提示

13.png

用记事本打开,一个字符一行,调整一下缩进

14.png

​ flag6{20240217}  计算md5  

    for (let i = 0; i < 1e8; i++) {
        if ((i & 0x1ffff) === 0x1ffff) {
            const progress = i / 1e8;
            const t = Date.now() - t0;
            console.log(`${(progress * 100).toFixed(2)}% ${Math.floor(t / 1000)}s ETA:${Math.floor(t / progress / 1000)}s`);
        }
        if (MD5(String(i)) === '1c450bbafad15ad87c32831fa1a616fc') {
            document.querySelector('#result').textContent = `flag6{${i}}`;
            break;
        }
    }

直接跑一会或者https://www.cmd5.com/查询

15.png

flag7{Djl9NQ} 视频中出现的git地址,根据历史提交记录找到https://github.com/ganlvtech/52pojie-2024-challenge/commit/6bbac038c4813fbc5d129a8d605471ea2e374786

flag8{OaOjIK} flagB 直接玩游戏干他丫的,根据v50的提示溢出

16.png

首先要知道多少溢出,直接从2^1-2^64次方买一遍5,买到2^34 17179869184 时提示变了

{"code":1,"msg":"购买商品之后钱怎么还变多了?不知道出什么 bug 了,暂时先拦一下 ^_^"}

钱变多了肯定是有负号,说明需要钱不增加的情况下购买。

首先是数据类型,很容易判断出是i64 -2^63 到 2^63-1

#include <iostream>
#include <cstdint>
int main() {
    int64_t a,b,c;
    a=999063388;
    b=8589934592;
    c=17179869184;
    std::cout << a*b;
    std::cout << a*c;
    return 0;
}
8581889156181917696
-1282965761345716224
ID 商品名称 商品描述 价格
4 flag8 获取 flag8 内容 10000 金币
5 flagB 获取 flagB 内容 999063388 金币

所以要想实现零元购   单价乘以数量 必须等于2^64 *n (n=1,2,3……)

刚好8和b都是4的倍数,所以直接购买 2^62个  ( 2^62 X 4 )X (999063388%4)
17.png

高级

flag10{6BxMkW}

上面那张图片

from PIL import Image
png="flag4_flag10.png"
img = Image.open(png)
img = img.convert("CMYK")
img.show()

18.png

flag11{HPQfVF} 拼图,根据css,按30*30切分了,所以transform里面应该是整数

:root {
    --var1: 0; /* 在 0 ~ 100 范围内找到一个合适的值 */
    --var2: 0; /* 在 0 ~ 100 范围内找到一个合适的值 */
}

#a000 {
    position: absolute;
    left: 0;
    top: 0;
    width: 30px;
    height: 30px;
    background: url(flag11.png) 0px 0px;
    transform: translate(calc(942.5135817416999px + 1.0215884355337748px * var(--var1) + 0.24768196677010001px * var(--var2)), calc(224.16483995058888px + 2.9293942195858147px * var(--var1) + 0.8924085229409133px * var(--var2)));
}
#include <iostream>

int main() {
    float a = 942.5135817416999;
    float b = 1.0215884355337748;
    float c = 0.24768196677010001;
    float d = 224.16483995058888;
    float e = 2.9293942195858147;
    float f = 0.8924085229409133;
    for (int i = 0; i < 100; i++) {
        for (int j = 0; j < 100; j++) {
            float dd = a + b * i + c * j;
            float ww = d + e * i + f * j;
            if (dd -(int)dd == 0 && ww - (int)ww == 0) {
                std::cout << i << " " << j << std::endl;
            }
        }
    }
    return 0;
}
//71 20

19.png

flag12{HOXI} 很简单的wasm

let num = 1213159497;//(int32)(secret* 1103515245)!= 1 ? 0: 1213159497
let str = '';
while (num > 0) {
    str = String.fromCodePoint(num & 0xff) + str;
    num >>= 8;
}
console.log(`flag12{${str}}`);

直接跑也行,也就几秒钟

#include <iostream>
#include <cstdint>
int main() {
    int32_t a,b,c;
    a=1103515245;
    for (uint32_t i=0; i<4294967295; i++) {
        b = i*a;
        if (b==1) {
            c = i;
            printf("secret
: %lu\n", c);
            break;
        }
    }
    return 0;
}//secret :4005161828

flagC 每个人的不一样仅供参考

识别图片后提交了三个参数

boxes 坐标 用来画框 四个一组分别是左上(boxes[0],boxes[1]) 右下 (boxes[2],boxes[3])

scores 置信度

classes 种类

结合响应可以模仿画一画,虽然也没啥用

import cv2
data = {
    "boxes": [
    ],
    "scores": [
    ],
    "classes": [
    ],
    "labels": [
    ],
    "colors": [
    ]
}
png ="test.png"
img = cv2.imread(png)
h, w, _ = img.shape
for i, box in enumerate(data["classes"]):
    x1, y1, x2, y2 = int(data["boxes"][i * 4] * w), int(data["boxes"][i * 4 + 1] * h), int(data["boxes"][i * 4 + 2] * w), int(data["boxes"][i * 4 + 3] * h)
    color = tuple(int(data["colors"][i][j:j+2], 16) for j in (0, 2, 4))[::-1]
    cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
    cv2.putText(img, str(i)+"_"+data["labels"][i].split(" ")[0] + " " + str(data["scores"][i])[0:4], (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 255), 1)
cv2.imshow("img", img)
for i, box in enumerate(data["classes"]):
    x1, y1, x2, y2 = int(data["boxes"][i * 4] * w), int(data["boxes"][i * 4 + 1] * h), int(data["boxes"][i * 4 + 2] * w), int(data["boxes"][i * 4 + 3] * h)
    crop = img[y1:y2, x1:x2]
    name = data["labels"][i].split(" ")[0]
    cv2.imwrite(f"{i}-{name}.png", crop)
cv2.waitKey(0)

根据提示修改,第一次提示种类过多,减到4个没有问题了

然后跑一下有哪些种类

for i in range(0,80):
        data = {
            "boxes": [
                0.00,
                0.00,
                0.50,
                0.50,
                0.50,
                0.00,
                1.00,
                0.50,
                0.00,
                0.50,
                0.50,
                1.00,
                0.50,
                0.50,
                1.00,
                1.00,
            ],
            "scores": [
                0.8933814167976379,
                0.8905049562454224,
                0.884631872177124,
                0.8726911544799805
            ],
            "classes": [
                0,
                i,
                9,
                9
            ]
        }
        response = session.post(url, headers=headers,  json=data)
        text = response.text
        if "种类错误" in text:
            continue
        else:
            print(i)

跑完了我也只有0和9 那么根据排列组合  

已知四位数,由0和9构成,0可以是首位,0和9至少出现1次,这个四位数有多少种可能

高中知识全换给老师了,交给各位了

最终我提交的内容,也就是两个人等traffic light

data = {
            "boxes": [
                0.00,
                0.00,
                0.50,
                0.50,
                0.50,
                0.00,
                1.00,
                0.50,
                0.00,
                0.50,
                0.50,
                1.00,
                0.50,
                0.50,
                1.00,
                1.00,
            ],
            "scores": [
                1,
                1,
                1,
                1
            ],
            "classes": [
                0,
                9,
                0,
                9
            ]
}

免费评分

参与人数 3吾爱币 +3 热心值 +3 收起 理由
debug_cat + 1 + 1 用心讨论,共获提升!
Sayon + 1 + 1 我很赞同!
麦田孤望者 + 1 + 1 用心讨论,共获提升!

查看全部评分

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

风子09 发表于 2024-2-25 00:20
安卓中级知道还有二次修复,还有自己偏移,这个做不到了
Sayon 发表于 2024-2-25 00:21
gzwzj 发表于 2024-2-25 00:27
本帖最后由 gzwzj 于 2024-2-25 00:44 编辑

Windows初始,内存 x86dbg 找的
安卓初级1,jadx 看源码,找到是视频尾
安卓初级2,jadx 看源码,frida hook 暴力改属性值为 o = [10, 99, 0]
web 玩了初级和中级,其中cookie 那里,我是直接把 flagA 的值,改到 uid 里,刷新一下页面,就出来了
其他实在没能力了,还需要学习
DNLINYJ 发表于 2024-2-25 00:59
这次windows高级题实在是搞不出来了 server不知道淦哪里给我整不会了

点评

哈哈哈,看来确实比较难,com的方式不太熟不太好找。  详情 回复 发表于 2024-2-26 17:50
debug_cat 发表于 2024-2-25 09:10
风子09 发表于 2024-2-25 00:20
安卓中级知道还有二次修复,还有自己偏移,这个做不到了

直接扣代码修复就行
风子09 发表于 2024-2-25 11:05
debug_cat 发表于 2024-2-25 09:10
直接扣代码修复就行

刚刚看了其他大神分析,原来&#127542;AB两处偏移,改成B就二次修复了,心服口服
max9min 发表于 2024-2-25 11:21
大佬太强了,混淆真的令人头疼
Hmily 发表于 2024-2-26 17:50
DNLINYJ 发表于 2024-2-25 00:59
这次windows高级题实在是搞不出来了 server不知道淦哪里给我整不会了

哈哈哈,看来确实比较难,com的方式不太熟不太好找。
HLC000 发表于 2024-7-24 23:13
用心讨论,共获提升!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-21 20:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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