BUUCTF [NPUCTF2020]

文件无壳 拖入ida

573689b2a9da4e028a749acc6a94094f.png

shift+F12查找可疑字符串 发现一串很像base64编码表的字符串

59e471399ac84bdb82b42714b3e3fea2.png

双击进去 F5查看伪c代码

f30baa340d964cadab826852e5e12a4b.png

跟进RxEncode函数

b4084c367fb240f8928e904cec7d84ce.png

 

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

  v3 = 3 * (a2 / 4);
  v5 = 0;
  v4 = a1[a2 - 1] == 61;
  if ( a1[a2 - 2] == 61 )
    ++v4;
  if ( a1[a2 - 3] == 61 )
    ++v4;
  if ( v4 == 3 )
  {
    v3 += 2;
  }
  else if ( v4 <= 3 )
  {
    if ( v4 == 2 )
    {
      v3 += 3;
    }
    else 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;
    return s;
  }
  else
  {
    puts("No enough memory.");
    return 0LL;
  }
}

编码过程

  • 使用一个循环遍历输入字符串的前a2 - v4个字符(其中v4是末尾等号的数量),这些字符将被编码。
  • 对于每组4个输入字符(或更少,如果接近字符串末尾),使用find_pos函数(该函数未在代码中定义,但可能是一个查找字符在Base64编码表中的位置的函数)将每个字符转换为一个6位的二进制数,并将这些数拼接成一个较大的二进制数。
  • 如果一组字符少于4个,则在拼接的二进制数左侧进行零填充,以模拟完整的4字节输入。
  • 然后,将这个大二进制数拆分成3字节的块(每个块对应于Base64编码中的4个字符),并将这些块转换为相应的Base64字符。
  • 将编码后的字符存储在之前分配的内存中。

输入数据后直接base64解码然后比较,只是把base64的56改为{}

上脚本 这里借鉴这位师傅的代码http://t.csdnimg.cn/yo118

s2 = b'\x0F\xD3p\xFE\xB5\x9C\x9B\x9E'[::-1]+ b'\xDE\xAB\x7F\x02\x9CO\xD1\xB2'[::-1] + b'\xFA\xCD\x9D@\xE7ceY'[::-1]
#仅56换为{} 的base64
from base64 import b64encode
print(b64encode(s2))

得到flag

aa1370a2c25e44dc8842c43cfeb76a66.png

flag{w0w+y0U+cAn+r3lllY+dAnc3} 

 

### BUUCTF ACTF2020 Upload Challenge Writeup #### 文件上传漏洞分析 文件上传功能如果未经过严格的安全验证,可能会被攻击者利用来执行恶意操作。常见的安全风险包括但不限于:任意文件上传、脚本注入以及通过特定扩展名绕过检测机制等[^1]。 #### 解决方案概述 对于`ACTF2020 新生`中的`Upload`题目,在成功上传文件后返回路径 `./uplo4d/ddea6db74c0ab39b95ce495a41dfb1bf.phtml` 表明服务器端存在PHP处理逻辑,并且允许访问该位置下的`.phtml`文件[^2]。这暗示着可能存在远程代码执行的风险。 为了进一步探索此漏洞的可能性: - **确认环境配置** 攻击面在于能够控制的内容会被解释器解析并运行。因此首先要了解目标系统的具体设置,比如是否启用了危险函数如`exec()` 或其他可调用外部命令的功能[^3]。 - **测试命令注入** 如果上述条件成立,则可以通过构造特殊请求参数尝试触发系统指令执行。例如向URL附加额外的shell命令字符串以获取更多关于主机的信息或读取敏感数据文件。 ```bash http://target.com/upload.php?cmd=whoami&file=ddea6db74c0ab39b95ce495a41dfb1bf.phtml ``` 此处假设`upload.php`为负责接收POST提交表单并保存附件的服务接口;而`cmd`代表要传递给后台程序用于动态拼接SQL语句或其他业务流程的关键字。实际情况下应根据具体情况调整Payload结构。 最终目的是找到一种方法使服务端按照预期行为响应我们的自定义输入,从而实现信息泄露乃至完全控制系统的目的。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值