吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1534|回复: 14
上一主题 下一主题
收起左侧

[CTF] 【2026春节红包】2、3、4、5、6、7、9、11偷懒解法为主

[复制链接]
跳转到指定楼层
楼主
geesehoward 发表于 2026-3-5 17:12 回帖奖励
本帖最后由 geesehoward 于 2026-3-5 17:11 编辑

写在前面:

这次解题,时间比较少,工作时间抽空解题,尽可能偷懒,以找到flag为主要目的

解题领红包之二 {Windows 初级题}

初级题,比较简单,拖进IDA,得到核心代码

int __cdecl sub_4CD130(char a1)
{
  __time32_t v1; // eax
  char v2; // al 
  char v3; // al
  char v4; // dl
  char v5; // cl
  int v6; // eax
  unsigned __int8 v8; // al
  int v9; // edx
  int v10; // edx
  int v11; // eax
  __time32_t *Time; // [esp+0h] [ebp-78h] BYREF
  char **v13; // [esp+14h] [ebp-64h]
  char *Str; // [esp+18h] [ebp-60h]
  char v15[4]; // [esp+1Ch] [ebp-5Ch] BYREF
  int v16; // [esp+20h] [ebp-58h]
  int (__cdecl *v17)(int, int, int, int, int, int); // [esp+34h] [ebp-44h]
  int *v18; // [esp+38h] [ebp-40h]
  int *v19; // [esp+3Ch] [ebp-3Ch]
  void (__noreturn *v20)(); // [esp+40h] [ebp-38h]
  __time32_t **p_Time; // [esp+44h] [ebp-34h]
  char *v22; // [esp+58h] [ebp-20h] BYREF
  int v23; // [esp+5Ch] [ebp-1Ch]
  char v24; // [esp+60h] [ebp-18h] BYREF
  char *v25; // [esp+70h] [ebp-8h]
  int savedregs; // [esp+78h] [ebp+0h] BYREF

  v25 = &a1;
  v17 = sub_4CC800;
  p_Time = &Time;
  v18 = dword_4CE3D4;
  v19 = &savedregs;
  v20 = sub_4CD4EA;
  sub_40C330(v15);
  sub_40A650();
  v16 = -1;
  v1 = time(0);
  srand(v1);
  SetConsoleOutputCP(0xFDE9u);
  sub_4C7E50((int)&dword_4D27C0, "========================================");
  ((void (*)(void))sub_4015B0)();
  sub_4C7E50((int)&dword_4D27C0, "   CrackMe Challenge v2.5 - 2026        ");
  ((void (*)(void))sub_4015B0)();
  sub_4C7E50((int)&dword_4D27C0, "========================================");
  ((void (*)(void))sub_4015B0)();
  sub_4C7E50((int)&dword_4D27C0, "Keywords: 52pojie, 2026, Happy new year");
  ((void (*)(void))sub_4015B0)();
  sub_4C7E50((int)&dword_4D27C0, "Hint: Fake flag; length is key");
  ((void (*)(void))sub_4015B0)();
  sub_4C7E50((int)&dword_4D27C0, "----------------------------------------");
  ((void (*)(void))sub_4015B0)();
  v22 = &v24;
  v23 = 0;
  v24 = 0;
  v16 = 1;
  v13 = &v22;
  sub_4C7E50((int)&dword_4D27C0, "\n[?] Enter the password: ");
  v13 = &v22;
  v2 = sub_401560();
  v13 = &v22;
  sub_4C5840(&dword_4D25E0, &v22, v2);
  Str = v22;
  v3 = sub_401740(v22);
  v4 = 53;
  v5 = v3;
  v6 = 0;
  if ( !v5 )
  {
    while ( Str[v6] == v4 )
    {
      if ( ++v6 == 16 )
      {
        v16 = 1;
        sub_4C7E50((int)&dword_4D27C0, "\n[!] You're getting closer...");
        v16 = 1;
        goto LABEL_9;
      }
      v4 = byte_4D3032[v6];
    }
    if ( strlen(Str) != 31 )
    {
      v16 = 1;
      sub_4C7E50((int)&dword_4D27C0, "\n[!] Hint: The length is your first real challenge.");
      goto LABEL_9;
    }
    v16 = 1;
    if ( (unsigned __int8)sub_4016D0(Str, 31) )
    {
      Str = 0;
      v8 = *v22;
      if ( !*v22 )
        goto LABEL_16;
      v9 = 0;
      do
      {
        Str += ++v9 * v8;
        v8 = v22[v9];
      }
      while ( v8 );
      if ( Str != (char *)44709 )
      {
LABEL_16:
        v16 = 1;
        sub_4C7E50((int)&dword_4D27C0, "\n[!] Checksum failed! Something is wrong...");
        ((void (*)(void))sub_4015B0)();
        sub_4C7E50((int)&dword_4D27C0, "[!] Expected: 44709, Got: ");
        sub_47DE70(Str);
        sub_4015B0(v10);
LABEL_17:
        v16 = 1;
        goto LABEL_10;
      }
      v16 = 1;
      sub_4C7E50((int)&dword_4D27C0, "\n========================================");
      ((void (*)(void))sub_4015B0)();
      sub_4C7E50((int)&dword_4D27C0, "        *** SUCCESS! ***                ");
      ((void (*)(void))sub_4015B0)();
      sub_4C7E50((int)&dword_4D27C0, "========================================");
      ((void (*)(void))sub_4015B0)();
      sub_4C7E50((int)&dword_4D27C0, "[+] Congratulations! You cracked it!");
      ((void (*)(void))sub_4015B0)();
      v11 = sub_4C7E50((int)&dword_4D27C0, "[+] Correct flag: ");
      sub_4C4330(v11, v22, v23);
    }
    else
    {
      v16 = 1;
      sub_4C7E50((int)&dword_4D27C0, "\n[X] Access Denied!");
      ((void (*)(void))sub_4015B0)();
      sub_4C7E50((int)&dword_4D27C0, "[X] Wrong password. Keep trying!");
    }
    ((void (*)(void))sub_4015B0)();
    goto LABEL_17;
  }
  sub_4C7E50((int)&dword_4D27C0, "\n[!] Nice try, but not quite right...");
LABEL_9:
  sub_4015B0(Time);
LABEL_10:
  sub_4017C0();
  sub_4B1AE0(v13);
  sub_40C600(v15);
  return 0;
}

核心检查逻辑点:

1、长度必须是31
2、sub_4016D0的返回值为非0
3、校验和为44709

查看sub_4016D0代码

bool __cdecl sub_4016D0(int a1, int a2)
{
  unsigned __int8 *Block; // ebp
  int v3; // eax
  int v4; // ebx
  bool v5; // dl

  Block = (unsigned __int8 *)sub_4CB710(0x64u);
  sub_401620(Block);
  if ( a2 <= 0 )
  {
    v4 = 0;
  }
  else
  {
    v3 = 0;
    v4 = 0;
    do
    {
      v5 = *(char *)(a1 + v3) == Block[v3];
      ++v3;
      v4 += v5;
    }
    while ( a2 != v3 );
  }
  j_j_free(Block);
  return a2 == v4;
}

核心逻辑是输入的字符串逐字节与Block比对,最后确定v4是否与输入的长度相等,那Block就是要找的flag,Block是在sub_401620中赋值的

查看代码

_BYTE *__cdecl sub_401620(int a1)
{
  _BYTE *result; // eax

  *(_DWORD *)a1 = 0x2D327077;
  *(_DWORD *)(a1 + 4) = 0x63272B28;
  *(_DWORD *)(a1 + 8) = 0x701D6363;
  *(_DWORD *)(a1 + 12) = 0x1D747072;
  *(_DWORD *)(a1 + 16) = 0x3232230A;
  *(_DWORD *)(a1 + 20) = 0x272C1D3B;
  *(_DWORD *)(a1 + 24) = 0x273B1D35;
  *(_BYTE *)(a1 + 30) = 0x63;
  *(_WORD *)(a1 + 28) = 0x3023;
  result = (_BYTE *)a1;
  do
    *result++ ^= 0x42u;
  while ( result != (_BYTE *)(a1 + 31) );
  *(_BYTE *)(a1 + 31) = 0;
  return result;
}

本次都是偷懒解法,所以IDA直接调试,在19行下断点


如图得到flag

解题领红包之三 {Android 初级题}

直接玩游戏,得到flag{Wu41_P0j13_2026_Spr1ng_F3st1v4l}

解题领红包之四 {Windows 初级题}

查壳

解压

【2026春节】解题领红包之四 {Windows 初级题} 出题老师:云在天.exe_extracted文件夹中得到crackme_easy.pyc

在线解字节码得到源码

# Decompiled with PyLingual (https://pylingual.io)
# Internal filename: 'crackme_easy.py'
# Bytecode version: 3.14rc3 (3627)
# Source timestamp: 1970-01-01 00:00:00 UTC (0)

import hashlib
import base64
import sys
def xor_decrypt(data, key):
    """XOR解密"""
    result = bytearray()
    for i, byte in enumerate(data):
        result.append(byte ^ key ^ i & 255)
    return result.decode('utf-8', errors='ignore')
def get_encrypted_flag():
    """获取加密的flag"""
    enc_data = 'e3w+fiRvfW18fnx4ZAZ6Pj43YwB9OWMXfXo8Dg4O'
    return base64.b64decode(enc_data)
def generate_flag():
    """动态生成flag"""
    encrypted = get_encrypted_flag()
    key = 78
    result = bytearray()
    for i, byte in enumerate(encrypted):
        result.append(byte ^ key)
    return result.decode('utf-8')
def calculate_checksum(s):
    """计算校验和"""
    total = 0
    for i, c in enumerate(s):
        total += ord(c) * (i + 1)
    return total
def hash_string(s):
    """计算字符串哈希"""
    return hashlib.sha256(s.encode()).hexdigest()
def verify_flag(user_input):
    """验证flag"""
    correct_flag = generate_flag()
    print(f'[+] Correct flag: {correct_flag}')
    if len(user_input)!= len(correct_flag):
        return False
    else:
        for i in range(len(correct_flag)):
            if user_input[i]!= correct_flag[i]:
                return False
        return True
def fake_check_1(user_input):
    """假检查1"""
    fake_hash = 'a1b2c3d4e5f67890abcdef1234567890abcdef1234567890abcdef1234567890'
    return hash_string(user_input) == fake_hash
def fake_check_2(user_input):
    """假检查2"""
    fake_hash = '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'
    return hash_string(user_input) == fake_hash
def main():
    """主函数"""
    print('==================================================')
    print('   CrackMe Challenge - Python Edition')
    print('==================================================')
    print('Keywords: 52pojie, 2026, Happy New Year')
    print('Hint: Decompile me if you can!')
    print('--------------------------------------------------')
    user_input = input('\n[?] Enter the password: ').strip()
    if fake_check_1(user_input):
        print('\n[!] Nice try, but not quite right...')
        input('\nPress Enter to exit...')
        return None
    else:
        if fake_check_2(user_input):
            print('\n[!] You\'re getting closer...')
            input('\nPress Enter to exit...')
        else:
            if verify_flag(user_input):
                checksum = calculate_checksum(user_input)
                expected_checksum = calculate_checksum(generate_flag())
                if checksum == expected_checksum:
                    print('\n==================================================')
                    print('        *** SUCCESS! ***')
                    print('==================================================')
                    print('[+] Congratulations! You cracked it!')
                    print(f'[+] Correct flag: {user_input}')
                else:
                    print('\n[!] Checksum failed!')
            else:
                print('\n[X] Access Denied!')
                print('[X] Wrong password. Keep trying!')
            input('\nPress Enter to exit...')
if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print('\n\n[!] Interrupted by user')
        sys.exit(0)

在38行后面加上打印得到flag

主要逻辑就是对字符串e3w+fiRvfW18fnx4ZAZ6Pj43YwB9OWMXfXo8Dg4O进行base64解码,然后逐字节与78进行异或。

解题领红包之五 {Windows 中级题}

查壳


Nuitka打包的

运行程序,在AppData\Local\Temp\onefile_66716_134171668082778958目录下拿到crackme_hard.dll

将dll拖进IDA,直接attach process调试

调试的时候忘记截图了,最后是内存追码得到的flag,通过初级题猜测也是逐字节比较,结果和想象中的差不多
由于是输入随机flag,调试的时候需要对一些内存值做修改,才能触发目标flag生成,由于是本人自己不想写太长的脚本,建议学习其他帖子中对bcode的解析脚本来实现。
得到flag:52p0j13@2026~H4ppy_N3w_Y34r!!!

解题领红包之六 {番外篇 初级题}

查壳


没壳,但是一个zip格式的压缩文件,直接winrar打开,发现lua源码,assets文件夹中发现flag.dat
确认flag.dat,不是明文,查看main.lua,搜索flag.dat,找到getWinMessage函数。

local function getWinMessage()
    local content = nil

    if love.filesystem.getInfo("assets/flag.dat") then
        content = love.filesystem.read("assets/flag.dat")
    end

    if not content or then
        return "You WIN!"
    end

    local key = "52pojie"
    local keyLen = #key
    local result = {}
    local bit = require("bit")

    for i = 1, #content do
        local b = string.byte(content, i)
        local k = string.byte(key, ((i - 1) % keyLen) + 1)
        table.insert(result, string.char(bit.bxor(b, k)))
    end

    return table.concat(result)
end

逻辑很简单,读取flag.dat文件,然后和52pojie循环异或,写一个C代码

int main(int argc, char** argv) {
    system("chcp 65001");
    unsigned char byteFlag[] = {
        0x53, 0x5E, 0x11, 0x08, 0x11, 0x5c, 0x57, 0x45, 0x5D, 0x1A, 0x06, 0x0f, 0x36, 0x57, 0x05, 0x00,
        0x46, 0x30, 0x22, 0x08, 0x15, 0x45, 0x4b, 0x2f, 0x21, 0x0f, 0x1E, 0x3A, 0x6c, 0x57, 0x11, 0x1D,
        0x4B, 0x36, 0x5B, 0x42, 0x0e, 0x0D
    };

    unsigned char key[] = "52pojie";

    char flag[39] = { 0 };
    for (int i = 0; i < sizeof(byteFlag); i++)
    {
        flag[i] = byteFlag[i] ^ key[i % 7];
    }
    printf("%s\n", flag);
    system("pause");
    return 0;
}

运行得到flag:flag{52pojie_2026_Happy_NewYear!>w<}

解题领红包之七 {Windows 中级题}

查壳

当时没有截图,加壳的文件没保存,这里就不截图了,简单的upx -d即可解压缩成功。

拖入IDA,找到核心代码sub_140008720

__int64 __fastcall sub_140008720(char *Str, FILE *Stream, FILE *a3)
{
  size_t v6; // rax
  __int64 v7; // rdi
  char v8; // dl
  __int64 result; // rax
  __int64 v10; // rdi
  unsigned __int64 v11; // r13
  char *v12; // rax
  char *v13; // r12
  unsigned __int64 v14; // rax
  _BYTE Buffer[16]; // [rsp+20h] [rbp-858h] BYREF
  _BYTE v16[2120]; // [rsp+30h] [rbp-848h] BYREF

  sub_140008640(v16);
  sub_140008500(v16, "52pojie_2026_", 14);
  v6 = strlen(Str);
  sub_140008500(v16, Str, v6);
  v7 = sub_140008580(v16);
  fread(Buffer, 0x10u, 1u, Stream);
  v8 = sub_140008310(v16, v7, Buffer);
  result = 1;
  if ( v8 )
  {
    fseek(Stream, 0, 2);
    v10 = ftell(Stream);
    result = 2;
    v11 = v10 - 16;
    if ( (v10 & 7) == 0 )
    {
      fseek(Stream, 16, 0);
      v12 = (char *)malloc(v10 - 16);
      v13 = v12;
      if ( v12 )
      {
        fread(v12, 1u, v10 - 16, Stream);
        sub_1400081E0(v16, v13, v10 - 16);
        if ( (unsigned __int8)sub_1400082E0(v16) )
        {
          v14 = (unsigned __int8)v13[v10 - 17];
          if ( v11 < v14 )
          {
            free(v13);
            return 5;
          }
          else
          {
            fwrite(v13, 1u, v11 - v14, a3);
            free(v13);
            return 0;
          }
        }
        else
        {
          free(v13);
          return 4;
        }
      }
      else
      {
        return 3;
      }
    }
  }
  return result;
}

sub_140008640是初始化CRC64使用的内存,sub_140008500和sub_140008580都是进行CRC64的计算,sub_140008580是针对密钥总长度、在"52pojie2026" + 输入的flag基础上,算出最终的密钥。
sub_140008310是对文件头进行处理,根据逻辑可以得到如下结论:


    []0-3字节为magic,固定值0x36324D43
    [
    ]4-7字节是被加密文件的CRC32值
  • 8-15字节是加密是的初始IV

随后,将文件16字节之后的数据读入内存,调用sub_1400081E0解密并计算解密后数据的CRC32。
查壳sub_1400081E0的代码

__int64 __fastcall sub_1400081E0(__int64 a1, __int64 a2, __int64 a3)
{
  unsigned __int64 v3; // rbx
  unsigned __int64 v5; // rdi
  __int64 v6; // r12
  __int64 result; // rax

  v3 = a2 - 24627;
  v5 = a2 - 24627 + (a3 & 0xFFFFFFFFFFFFFFF8uLL);
  if ( a2 - 24627 < v5 )
  {
    v6 = a1 + 288;
    do
    {
      v3 += 8LL;
      sub_140008080(a1, v3 + 24619);
      result = sub_140008480(v6, v3 + 24619, 8);
    }
    while ( v3 < v5 );
  }
  return result;
}

核心逻辑是循环调用sub_140008080解密,并调用sub_140008480计算已解密部分的CRC32。
查壳sub_140008080

char __fastcall sub_140008080(unsigned __int64 *a1, __int64 *a2)
{
  int v2; // r8d
  __int64 v3; // r11
  unsigned __int64 v5; // rax
  char *v6; // rcx
  unsigned __int64 v7; // rax
  _QWORD *v8; // rdx
  char v9; // al
  char result; // al

  v2 = 8;
  v3 = *a2;
  v5 = *a1;
  v6 = (char *)a1 - 21569;
  v7 = __ROL8__(v5, 3);
  do
  {
    v7 = (v7 << 8) | *((unsigned __int8 *)a1 + (HIBYTE(v7) | 0x221300) - 2233056);
    --v2;
  }
  while ( v2 );
  *a1 = v7;
  v8 = a2 + 4711;
  do
  {
    v9 = *((_BYTE *)v8 - 37688);
    ++v6;
    v8 = (_QWORD *)((char *)v8 + 1);
    result = v6[21568] ^ v6[21584] ^ v9;
    *((_BYTE *)v8 - 37689) = result;
  }
  while ( v6 != (char *)a1 - 21561 );
  a1[2] = v3;
  return result;
}

核心逻辑是将入参的key循环左移3位后,通过查表获得真正的key,然后和IV及密文进行异或运算,得到明文。
其中,密文将作为下一个8字节密文的IV。
根据密文1 = 明文1 ^ IV ^ key可知,明文1 = 密文1 ^ IV ^ key,由于文件是png格式,png头的8字节是已知的0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A
可以根据明文攻击获得第一个真实key,再逆向查表并右移3位得到CRC64的值,并调用sub_1400081E0解密文件。

unsigned char unk_14000A270[256] = {
    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
    0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
    0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
    0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
    0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
    0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
    0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
    0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
    0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
    0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
    0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
};

void __fastcall sub_140008080(_BYTE* key, _BYTE* IV, _BYTE* encryptedData)
{
    __int64 v3;

    v3 = *(__int64*)encryptedData;
    *(unsigned __int64*)key = __ROL8__(*(unsigned __int64*)key, 3);
        for (int i = 0; i < 8; i++)
    {
        key[i] = unk_14000A270[key[i]];
    }
    *(__int64*)encryptedData = *(__int64*)key ^ *(__int64*)IV ^ *(__int64*)encryptedData;
    *((unsigned __int64*)IV) = v3;
}

void __fastcall sub_140008480(_DWORD* crc32, _BYTE* data, __int64 len)
{
    __int64 result;
    result = (unsigned int)*crc32;
    for (int i = 0; i < len; i++)
    {
        result = data[i] ^ result;
        for (int j = 0; j < 8; j++)
        {
            result = ((unsigned int)result >> 1) ^ -(result & 1) & 0xEDB88320;
        }
    }
    *crc32 = result;
}

void __fastcall sub_1400081E0(_BYTE* key, _BYTE* IV, _BYTE* encryptedData, __int64 len, _DWORD *crc32)
{
    for (int i = 0; i < len; i += 8)
    {
        sub_140008080(key, IV, (encryptedData + i));
    }
    sub_140008480(crc32, encryptedData, len); //计算CRC32
}

int main(int argc, char** argv) {
    unsigned char pngHeader[] = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };
    FILE* fp = NULL;
    fopen_s(&fp, "F:\\2026\\52pojie\\7\\flag.png.encrypted", "rb");
    if (fp)
    {
        fseek(fp, 0, 2);
        long filesize = ftell(fp);
        fseek(fp, 0, 0);
        _BYTE* fileData = (_BYTE*)malloc(filesize);
        if (fileData)
        {
            fread(fileData, 1u, filesize, fp);
                        _DWORD fileCrc32 = *(_DWORD*)(fileData + 4);
            unsigned char Key[8] = { 0 };
            unsigned char IV[8] = { 0 };
            memcpy(IV, fileData + 8, 8);
            *(_QWORD*)Key = *(_QWORD*)IV ^ *(_QWORD*)pngHeader ^ *(_QWORD*)(fileData + 16);
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 256; j++)
                {
                    if (unk_14000A270[j] == Key[i])
                    {
                        Key[i] = j;
                        break;
                    }
                }
            }
            *(_QWORD*)Key = __ROR8__(*(_QWORD*)Key, 3);
            _DWORD crc32 = -1;
            sub_1400081E0(Key, IV, fileData + 16, filesize - 16, &crc32);
            if (~crc32 == fileCrc32)
            {
                printf("OK\n");
                FILE* out = NULL;
                fopen_s(&out, "F:\\2026\\52pojie\\7\\flag.png", "wb+");
                if (out)
                {
                    fwrite(fileData + 16, 1u, filesize - 16, out);
                    fclose(out);
                }
            }
            else 
            {
                printf("Error\n");
            }
            free(fileData);
        }
        fclose(fp);
    }
    system("pause");
    return 0;
}

运行后得到原图,图像显示HEX_ME,拖进随波逐流


得到flag:flag{EncrypTIoN_Is_haRd_52p0jIE_2o26_m62Tc4uj78maAq1C}

解题领红包之九 {Web 中级题}

本题只能用拉马努金风格来写了,代码较多,逻辑懒得分析,调试过程中,注意到,memory中5439744开始的200字节,是50个int值,且都为可见字符的ascii


这个值是存在var6中的

于是将50个ascii按顺序保存并转为字符串,播放语音发现完全一直,于是得到flag

解题领红包之十一 {MCP 中级题}

这道题的难点在于开始给的提示除了玄霄密令之外,其它线索完全没给,另外就是时效问题,
具体的过程就不写了,一个过程AI回复了一大堆有的没的。
根据文档提示逐步拿到access_token和audit_access后,得到flag:flag{new_year_2026_keep_warm}

免费评分

参与人数 4威望 +1 吾爱币 +23 热心值 +4 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hincer + 1 + 1 用心讨论,共获提升!
buluo533 + 1 + 1 用心讨论,共获提升!
fengji215 + 1 + 1 谢谢@Thanks!

查看全部评分

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

沙发
Z564493690 发表于 2026-3-5 17:28
楼主威武!
3#
renwei3608 发表于 2026-3-5 19:37
4#
darklord 发表于 2026-3-5 20:06
5#
caishen4396 发表于 2026-3-5 20:41
太巧妙了
6#
vinns2019 发表于 2026-3-5 22:23
学习ing~~~
7#
BAIQWE 发表于 2026-3-5 23:51
有谁教教我,这啥意思?看不懂。
8#
BAIQWE 发表于 2026-3-5 23:53
你们真能看懂吗?
9#
jbdb2005 发表于 2026-3-6 08:48
不懂,太深奥了
10#
ljxx2020 发表于 2026-3-6 09:39
哪里可以领取红包
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2026-3-17 08:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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