BUU NPUCTF2020

本文探讨了一段看似Base64编码但隐藏加密细节的代码,通过爆破和逻辑分析揭示了隐藏的flag。作者揭示了三次加密过程,并提供了关键脚本,展示了如何逐步解开谜团获取flag:NPUCTF{0bfu5er}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x0 你好sao啊

f5发现主函数逻辑很简单,直接找到关键函数进入:

void *__fastcall RxEncode(const char *a1, int a2)
{
  void *result; // rax
  int v3; // [rsp+18h] [rbp-38h]
  signed int v4; // [rsp+1Ch] [rbp-34h]
  int v5; // [rsp+20h] [rbp-30h]
  signed int v6; // [rsp+24h] [rbp-2Ch]
  int v7; // [rsp+28h] [rbp-28h]
  int v8; // [rsp+28h] [rbp-28h]
  signed int i; // [rsp+2Ch] [rbp-24h]
  _BYTE *v10; // [rsp+30h] [rbp-20h]
  void *s; // [rsp+38h] [rbp-18h]

  v3 = 3 * (a2 / 4);
  v4 = 0;
  v5 = 0;
  if ( a1[a2 - 1] == '=' )
    v4 = 1;
  if ( a1[a2 - 2] == '=' )
    ++v4;
  if ( a1[a2 - 3] == '=' )
    ++v4;
  if ( v4 == 3 )
  {
    v3 += 2;
  }
  else if ( v4 <= 3 )
  {
    if ( v4 == 2 )
    {
      v3 += 3;
    }
    else if ( v4 <= 2 )
    {
      if ( v4 )
      {
        if ( v4 == 1 )
          v3 += 4;
      }
      else
      {
        v3 += 4;
      }
    }
  }
  s = malloc(v3);
  if ( s )
  {
    memset(s, 0, v3);
    v10 = s;
    while ( v5 < a2 - v4 )
    {
      v6 = 0;
      v7 = 0;
      while ( v6 <= 3 && v5 < a2 - v4 )
      {
        v7 = (v7 << 6) | (char)find_pos(a1[v5]);
        ++v6;
        ++v5;
      }
      v8 = v7 << 6 * (4 - v6);
      for ( i = 0; i <= 2 && i != v6; ++i )
        *v10++ = v8 >> 8 * (2 - i);
    }
    *v10 = 0;
    result = s;
  }
  else
  {
    puts("No enough memory.");
    result = 0LL;
  }
  return result;
}

拿到之后乍一看感觉很像base64,输入32位转成24位,但其实仔细看下发现不同。

这里选择直接爆破:

table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234{}789+/="
c="9E9B9C B5FE70 D30FB2 D14F9C 027FAB DE5965 63E740 9DCDFA"
c=c.split()
for i in range(len(c)):
    c[i]=eval("0x"+c[i])

print(c)
for x in c:
    t=0
    for i in range(len(table)):
        for j in range(len(table)):
            for k in range(len(table)):
                for l in range(len(table)):
                    t=(0<<6)|i
                    t=(t<<6)|j
                    t=(t<<6)|k
                    t=(t<<6)|l
                    if(t==x):
                        print(table[i]+table[j]+table[k]+table[l])
                        print(i)
                        print(j)
                        print(k)
                        print(l)

'''
npuctf{w0w+y0U+cAn+r3lllY+dAnc3}
'''

得到的结果把带有=的删掉,剩下的拼接起来就是flag~

0x1 Baby Obfuscation

通过三条加密:

直接上脚本吧:

AOX = [78, 78, 85, 59, 80, 64, 115, 46, 98, 96, 117, 53, 97, 108, 125]
v = [2, 3, 4, 5]

for i in range(len(AOX)):
    AOX[i] ^= v[i % 4]
    AOX[i] += v[i % 4]
for i in range(len(AOX)):
    print(chr(AOX[i]), end="")

'''
NPUCTF{0bfu5er}
'''

 

### BUU ZIP 文件格式解压方法与工具 #### 1. ZIP伪加密原理分析 ZIP伪加密是一种通过修改文件结构来实现看似加密的效果的技术。实际上,这种技术并未真正对数据进行加密处理,而是通过对特定字段的篡改使得某些解压工具无法正常读取文件内容[^1]。 在标准ZIP文件中,“压缩源文件数据区”的头部标记为`50 4B 03 04`,而“压缩源文件目录区”的头部标记为`50 4B 01 02`。如果存在伪加密,则通常会在“压缩源文件目录区”中的某个标志位上设置特殊值(如第9个字节被设为非零)。这会误导部分解压程序认为该文件需要密码才能打开[^2]。 #### 2. 解除BUU ZIP伪加密的方法 对于带有伪加密特性的ZIP文件,可以通过手动编辑其二进制数据的方式解除此限制: - 使用十六进制编辑器定位到`50 4B 01 02`对应的区域; - 找到该区域内偏移量为8的位置(即第9个字节),将其值由非零改为`00`; - 完成上述操作后保存更改并尝试重新加载ZIP档案,此时应能成功访问其中的内容而不需输入任何密码。 需要注意的是,在实际应用过程中应当谨慎对待未知来源或者未经验证安全性的压缩文档,以免遭受恶意软件攻击或其他形式的信息泄露风险。 #### 3. 推荐使用的工具 以下是几款适用于处理此类问题的专业级工具列表: - **HxD**: 这是一款功能强大的免费十六进制编辑器,支持大容量文件查看与修改,并具备直观易用的操作界面。 - **WinHex**: 另一款知名商业产品,除了基本功能外还提供了丰富的附加特性,例如磁盘镜像创建/恢复以及高级数据分析选项等。 - **7-Zip**: 虽然主要用于常规存档管理任务,但它也内置了一个简单的HEX视图模式,允许用户快速浏览小型文件内部结构。 这些工具有助于识别潜在的安全隐患并通过适当手段加以解决。 ```python # 示例代码展示如何利用Python脚本自动修复ZIP伪加密问题 import os def fix_zip_pseudo_encryption(zip_path): with open(zip_path, 'r+b') as f: data = bytearray(f.read()) # 查找压缩源文件目录区位置 dir_header_pos = data.find(b'\x50\x4B\x01\x02') if dir_header_pos != -1: encryption_flag_byte_index = dir_header_pos + 8 # 修改第九个字节为00表示无加密状态 data[encryption_flag_byte_index] &= ~0x0F # 将改动写回原文件 f.seek(0) f.write(data) if __name__ == "__main__": target_file = r"C:\path\to\target.zip" fix_zip_pseudo_encryption(target_file) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值