2025-10-23

โš™๏ธ Rust Tickler

image.png

๐Ÿ“„rust_tickler34KB

image.png

Main XOR Function: FUN_140001940 (Address: 0x140001940)
This is the core encryption/decryption function that:
Takes an input buffer, key buffer, and their sizes
Performs byte-by-byte XOR operations
Uses a cyclic key pattern: output[i] = input[i] ^ key[i % key_length]

Encrypted Flag String
Location: 0x14000a000
Content: "7=06*gagg30d03gf2f5g5dba3c0hhcd2c4b,"

Key Value 51 (0x33)

Key storage: 0x14000a0e0
The value 51 likely represents the key length or size parameter
It's used in modulo calculations to cycle through the key bytes
main function

ulonglong *
FUN_140001940(ulonglong *param_1,void *param_2,ulonglong param_3,longlong param_4,ulonglong param_5)

{
  byte *pbVar1;
  void *_Dst;
  ulonglong uVar2;
  ulonglong uVar3;
  
  if (-1 < (longlong)param_3) {
    if (param_3 == 0) {
      *param_1 = 0;
      param_1[1] = 1;
      param_1[2] = 0;
      return param_1;
    }
    _Dst = (void *)thunk_FUN_140002390(param_3,1);
    if (_Dst != (void *)0x0) {
      memcpy(_Dst,param_2,param_3);
      *param_1 = param_3;
      param_1[1] = (ulonglong)_Dst;
      param_1[2] = param_3;
      if (param_5 != 0) {
        if (param_3 == 1) {
          uVar2 = 0;
        }
        else {
          uVar2 = 0;
          do {
            if ((uVar2 | param_5) >> 0x20 == 0) {
              uVar3 = (uVar2 & 0xffffffff) % (param_5 & 0xffffffff);
            }
            else {
              uVar3 = uVar2 % param_5;
            }
            *(byte *)((longlong)_Dst + uVar2) =
                 *(byte *)((longlong)_Dst + uVar2) ^ *(byte *)(param_4 + uVar3);
            uVar3 = uVar2 + 1;
            if ((uVar3 | param_5) >> 0x20 == 0) {
              uVar3 = (uVar3 & 0xffffffff) % (param_5 & 0xffffffff);
            }
            else {
              uVar3 = uVar3 % param_5;
            }
            pbVar1 = (byte *)((longlong)_Dst + uVar2 + 1);
            *pbVar1 = *pbVar1 ^ *(byte *)(param_4 + uVar3);
            uVar2 = uVar2 + 2;
          } while ((param_3 & 0x7ffffffffffffffe) != uVar2);
        }
        if ((param_3 & 1) == 0) {
          return param_1;
        }
        if ((uVar2 | param_5) >> 0x20 == 0) {
          uVar3 = (uVar2 & 0xffffffff) % (param_5 & 0xffffffff);
        }
        else {
          uVar3 = uVar2 % param_5;
        }
        *(byte *)((longlong)_Dst + uVar2) =
             *(byte *)((longlong)_Dst + uVar2) ^ *(byte *)(param_4 + uVar3);
        return param_1;
      }
      goto LAB_140001aa9;
    }
  }
  FUN_140006700();
LAB_140001aa9:
  do {
    invalidInstructionException();
  } while( true );
}
flag string
       1400095ff 00              ??         00h
                             //
                             // .data 
                             // ram:14000a000-ram:14000a1ff
                             //
                             s_2`f5g5dba3c0hhcd2c`4b,_14000a010              XREF[4,8]:   140000254(*), 14000161e(R), 
                             s_cd2c`4b,_14000a01e                                         140001747(R), 140001751(W), 
                             s_2c`4b,_14000a020                                           140001606(R), 140001612(R), 
                             s_b,_14000a024                                               140001758(R), 14000175f(W), 
                             s_,_14000a025                                                140001766(R), 140001774(W), 
                             s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000                 14000177c(RW), 140001783(RW)  
       14000a000 37 3d 30        ds         "7=06*gagg30d03gf2`f5g5dba3c0hhcd2c`4b,"
                 36 2a 67 
                 61 67 67 
XOR key 0x51, or 'Q', loaded in here at DAT_140007330
7=06*gagg30d03gf2f5g5dba3c0hhcd2c4b,

undefined8 UndefinedFunction_140001740(void)

{
  uint uVar1;
  uint uVar2;
  uint uVar3;
  uint uVar4;
  
  uVar1 = s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000._0_4_ ^ 0x51515151;
  uVar2 = s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000._4_4_ ^ 0x51515151;
  uVar3 = s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000._8_4_ ^ 0x51515151;
  uVar4 = s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000._12_4_ ^ 0x51515151;
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[0] = (char)uVar1;
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[1] = (char)(uVar1 >> 8);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[2] = (char)(uVar1 >> 0x10);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[3] = (char)(uVar1 >> 0x18);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[4] = (char)uVar2;
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[5] = (char)(uVar2 >> 8);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[6] = (char)(uVar2 >> 0x10);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[7] = (char)(uVar2 >> 0x18);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[8] = (char)uVar3;
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[9] = (char)(uVar3 >> 8);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[10] = (char)(uVar3 >> 0x10);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[11] = (char)(uVar3 >> 0x18);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[12] = (char)uVar4;
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[13] = (char)(uVar4 >> 8);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[14] = (char)(uVar4 >> 0x10);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[15] = (char)(uVar4 >> 0x18);
  uVar1 = s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000._16_4_ ^ 0x51515151;
  uVar2 = s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000._20_4_ ^ 0x51515151;
  uVar3 = s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000._24_4_ ^ 0x51515151;
  uVar4 = s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000._28_4_ ^ 0x51515151;
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[16] = (char)uVar1;
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[17] = (char)(uVar1 >> 8);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[18] = (char)(uVar1 >> 0x10);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[19] = (char)(uVar1 >> 0x18);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[20] = (char)uVar2;
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[21] = (char)(uVar2 >> 8);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[22] = (char)(uVar2 >> 0x10);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[23] = (char)(uVar2 >> 0x18);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[24] = (char)uVar3;
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[25] = (char)(uVar3 >> 8);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[26] = (char)(uVar3 >> 0x10);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[27] = (char)(uVar3 >> 0x18);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[28] = (char)uVar4;
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[29] = (char)(uVar4 >> 8);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[30] = (char)(uVar4 >> 0x10);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[31] = (char)(uVar4 >> 0x18);
  uVar1 = s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000._32_4_ ^ 0x51515151;
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[32] = (char)uVar1;
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[33] = (char)(uVar1 >> 8);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[34] = (char)(uVar1 >> 0x10);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[35] = (char)(uVar1 >> 0x18);
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[36] =
       s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[36] ^ 0x51;
  s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[37] =
       s_7=06*gagg30d03gf2`f5g5dba3c0hhcd_14000a000[37] ^ 0x51;
  return 0;
}

image.png

flag{6066ba5ab67c17d6d530b2a9925c21e3}

๐Ÿž NetSupport

image.png

๐Ÿ—„netsupport.zip3.7MB
1. The netsupport file contained a PowerShell script with an embedded byte array starting with [Byte[]]$xฯžzzghฯž = @(80,75,3,4,...)
2. The bytes 80,75,3,4 are ZIP magic bytes ("PK\x03\x04")
3. Extracted the byte array and converted it to extracted.zip (3.1 MB)
4. The ZIP contained NetSupport Manager remote administration tool files
5. Found the flag in download/CLIENT32.ini as a Base64-encoded string

image.png

extract the bytes

cat extract_zip.py 
#!/usr/bin/env python3
import re

# Read the netsupport file
with open('netsupport', 'r', encoding='utf-8-sig') as f:
    content = f.read()

# Find the byte array
match = re.search(r'\[Byte\[\]\]\$\w+\s*=\s*@\(([\d,\s]+)\)', content)

if match:
    # Extract the bytes
    byte_str = match.group(1)
    bytes_list = [int(x.strip()) for x in byte_str.split(',') if x.strip()]

    # Convert to bytes and write to file
    byte_data = bytes(bytes_list)

    with open('extracted.zip', 'wb') as f:
        f.write(byte_data)

    print(f"Extracted {len(byte_data)} bytes to extracted.zip")
    print(f"First bytes: {byte_data[:20].hex()}")
else:
    print("No byte array found")
                                             
Extract and unzip

image.png

Files from the zip

image.png

Look through and find the flag in the client32.ini file

image.png

image.png

flag{b6e54d0a0a5f2292589c3852f1930891}