VNCTF2022 WriteUp

暗号

ezmath

制限は60秒です。MCをプレイしている間、私のガベージコンピュータは777回の実行を終了できないとしか言​​えません。

2 ^ N-1が15で割り切れる場合、自然数Nはそれらの値を取る必要がありますBaidu search(2 ^ n-1)%15 has

from pwn import *
context.log_level='debug'
import re
def sha256(enc,sec):
    table = string.ascii_letters+string.digits
    for i in table:
        for j in table:
            for k in table:
                for n in table:
                    s = i+j+k+n
                    s1 = s+sec
                    m = hashlib.sha256(s1.encode())
                    mi = m.hexdigest()
                    if(enc == mi):
                        return s

p = remote('node4.buuoj.cn',28865)
rec = p.recv()
sec = rec[16:32].decode()
sha = rec[37:-23].decode()
print(sec,sha)
result = sha256(sha,sec)
print(result)
p.sendline(result.encode())
i = 0
while 1:
    r = p.recv().decode()
    que = re.search('plz give me the (.*)\(n\)',r).group(1)[:-3]
    ans = str(int(que)*4).encode()
    print(i)
    p.sendline(ans)
    i += 1
    if(i == 777):
        p.recv()
        p.recv()
        p.recv()
    p.recvuntil('are so smart.\n')

ウェブ

GameV4.0

/js/data.jsを見つけます。一番下まで引くと、base64でエンコードされたフラグが表示されます

VNCTF{Welcome_to_VNCTF2022}

逆行する

BabyMaze

古い方法を使用して、バイトコードを直接印刷します

import dis, marshal, sys

header_sizes = [
    # (size, first version this applies to)
    # pyc files were introduced in 0.9.2 way, way back in June 1991.
    (8,  (0, 9, 2)),  # 2 bytes magic number, \r\n, 4 bytes UNIX timestamp
    (12, (3, 6)),     # added 4 bytes file size
    # bytes 4-8 are flags, meaning of 9-16 depends on what flags are set
    # bit 0 not set: 9-12 timestamp, 13-16 file size
    # bit 0 set: 9-16 file hash (SipHash-2-4, k0 = 4 bytes of the file, k1 = 0)
    (16, (3, 7)),     # inserted 4 bytes bit flag field at 4-8
    # future version may add more bytes still, at which point we can extend
    # this table. It is correct for Python versions up to 3.9
]
header_size = next(s for s, v in reversed(header_sizes) if sys.version_info >= v)

with open('BabyMaze.pyc', "rb") as f:
    metadata = f.read(header_size)  # first header_size bytes are metadata
    code = marshal.load(f)          # rest is a marshalled code object

dis.dis(code)

ここに画像の説明を挿入

あなたはあなたがたくさんの0、2と11と13を得るのを見ることができます。

そして明らかにそれは31*31です

やる、絵を描く

s = '0000000000000000000000000000000010222222222222222220222222222002020000000002000002020000000200202220222222202220222020222020020000020000000002000002020202002220222022222222222220222022200002020002000000000000020000000022202022202222222220222022202002000202000200000002020002020200222220202220222020202220202220000000020200020202020002020002002222222022222022202022202022200200000000000000020202000202000022222220222222202022202220222002000002020202000200000200000000202220202020202220222222222220020202020202000200020000020002002020202020222022202022202022200202000202000200020202020002000022202220202222202020202220222002000202020200000202020002020200202220202022222220202020202020020200020200000000000202020202002022202020222222222020202020200200020202000002020202020202020022202020222220202022202220202000000200000002000200000002000200222220222220222022222220222220020000020002000200000002000002002222222220222222222222202222300000000000000000000000000000000'
from PIL import Image
pic = Image.new('RGB',(31,31),(255,255,255))
for i in range(31):
    for j in range(31):
        if(s[i*31+j] == '0'):
            pic.putpixel((j,i),(0,0,0))
        elif(s[i*31+j] == '1'):
            pic.putpixel((j,i),(255,255,0))
        elif(s[i*31+j] == '3'):
            pic.putpixel((j,i),(255,0,255))
pic.show()
pic.save('flag.png')

ここに画像の説明を挿入

フラグが29,29で出力された場合、開始点は1,1であることが後でわかります。

手で歩く

ssssddssaassddddwwwwddwwddddddwwddddddssddwwddddddddssssaawwaassaassaassddssaassaawwwwwwaaaaaaaassaassddddwwddssddssssaassddssssaaaaaawwddwwaawwwwaassssssssssssddddssddssddddddddwwaaaaaawwwwddssddwwwwwwwwddssddssssssssddddss

md5はフラグです(再起動されました。フラグはこれが当てはまるかどうかわかりません)

VNCTF{801f190737434100e7d2790bd5b0732e}

その他

アンケート

VNCTF{See_You_Next_Time!!!}

よく見る

ダイレクトスクリプトの隣人が間隔が違うことに気づきました。ブルーハットのセミファイナルブラストスクリプトを使いたかったのですが、見つからなかったのでPSが出ませんでした。結局、ハンドスマッシングを考えました。 1つずつ見ていくと、実は24行目と15行目には、白黒だけで、白だけが抽出されており、横軸と縦軸のインデックスがないことがわかりました。

from PIL import Image
pic = Image.open('flag.png')
w,h = [],[]
for i in range(pic.size[0]):
    if(pic.getpixel((i,15)) == (255,255,255)):
        w.append(i)
for i in range(pic.size[1]):
    if(pic.getpixel((24,i)) == (255,255,255)):
        h.append(i)
img = Image.new('RGB',(len(w),len(h)),(255,255,255))
for i in range(len(w)):
    for j in range(len(h)):
        img.putpixel((i,j),pic.getpixel((w[i],h[j])))
img.show()

ここに画像の説明を挿入

vnctf{34aE@w}

奇妙な旗

実際、ツリーに0と1を表すフォルダーがあるかどうかは、フォルダーと呼ばれる一種の難解です。例:

その後、手でこすります

ここに画像の説明を挿入

初めて1文字欠けているとしか言えない

vnctf{d23903879df57503879bcdf1efc141fe}

シンプルなmacos

弱いパスワードだとほのめかしませんでしたか?最初はキーチェーンとログインキーチェーンを爆破しました。後者はrockyouを使用し、前者は一般的な6000パスワードを使用しましたが、それでも爆破されませんでした。VNCTF(大文字と小文字を含む)とその16進数および基数を検索しても、何も見つかりませんでした。タイトルは主にシステムに関するものなので、システムフォルダに行って見つけました。プレブートを除いて、他のすべては空です、直接入ってください。その後、1つずつめくります(システムファイルは読み込まれていません)

次に、/ var/dbの下にあるものを見つけます。CryptoUserInfo.plistの場合

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>79FABCCE-3636-4266-A6CF-8E3BB40332B4</key>
	<dict>
		<key>FullName</key>
		<string>Scr1pt</string>
		<key>PasswordHint</key>
		<string>our secret need a password</string>
		<key>PictureData</key>
		<data>
		base串,不方便展示
		</data>
		<key>PictureFormat</key>
		<string>JPEG</string>
		<key>ShortName</key>
		<string>scr1pt</string>
		<key>UserType</key>
		<string>OpenDirectory</string>
	</dict>
</dict>
</plist>

passwordヒントoursecret

ここに画像の説明を挿入

もちろん、oursecretはこれらの機能ブロックに依存して識別されるため、ファイルの終わりを確認するプロンプトを表示せずにoursecretがoursecretであることも明らかです。

ここに画像の説明を挿入

明らかに、ファイルの終わりは他のデータと混合されており、}があります。これは後半のフラグだと思います。それで、それをコピーして、次の部分を削除してください

ここに画像の説明を挿入

次に、弱いパスワードを組み合わせます。2つ試してみました。パスワードは123456です

ここに画像の説明を挿入

フラグを取得するために組み合わせる

VNCTF{Macos_Forensllc_1s_s1MMple}

プライズホイール

最初はpython-exe-unpacker-masterの逆です

次に、BabyMazeがバイトコードを取得すると言われているメソッドを使用します

明らかにパスワードを見つけることができます:f6a623a2c577de3b46c079267d4bdd6e

ここに画像の説明を挿入

解凍します。
ここに画像の説明を挿入

その後、6時間以上成功しました

ここに画像の説明を挿入

最初に考えたのは、円を描いて読んでから並べ替えることでした。結果は次のとおりです。

ここに画像の説明を挿入

ただ変だ。

インデックスのヒントを考えると、私はすぐに[HECTF2021] 7色の虹、[b01lers2020]image_adjustmentsを思い浮かべます。wpを見るのは正確には何ですか

したがって、さらに奇妙な写真があります。デバッグがカバーされているため、画像はここには表示されていません。

その後、上記の2つをつなぐことを考えました。つまり、サークルで読み取り、インデックスを検索し、タイルに書き込みます

ここに画像の説明を挿入

おそらくこの鳥のような写真を手に入れてください。

はっきりと見えるのは、彼らがより平坦になっているということです。それからこれを組み合わせると大きなターンテーブルになります、ええ、私はそれを思いつきました。

サークルで読み取り、インデックスを検索し、サークルで書き込む必要があります

その後、1時間近くスクリプトを調整しましたが、あまりにもひどいものでした。

from PIL import Image
def get_round(w):
    tb = []
    #从左上到右上、从右上到右下、从右下到左下、从左下到左上,分四步
    for i in range(w,609-w):
        tmp = img.getpixel((i,w))
        # print(tmp)
        tb.append(tmp)
    # print(len(tb))
    for i in range(w+1,609-w):
        tmp = img.getpixel((609-1-w,i))
        tb.append(tmp)
    for i in range(w+1,609-w):
        tmp = img.getpixel((609-1-i,609-w-1))
        tb.append(tmp)
    for i in range(w+1,609-w-1):
        tmp = img.getpixel((w,609-1-i))
        tb.append(tmp)
    # print(len(tb)) #2432== 609*2+607*2
    return tb

def put_round(w,img,tb): #用和上面一样的方法,只不过要放值进去,就这样。
    ind = 0
    for i in range(w,609-w):
        tmp = img.putpixel((i,w),tb[ind])
        ind += 1
    # print(len(tb))
    for i in range(w+1,609-w):
        tmp = img.putpixel((609-1-w,i),tb[ind])
        ind += 1
    for i in range(w+1,609-w):
        tmp = img.putpixel((609-1-i,609-w-1),tb[ind])
        ind += 1
    for i in range(w+1,609-w-1):
        tmp = img.putpixel((w,609-1-i),tb[ind])
        ind += 1

if __name__ == '__main__':
    # 除去最中间那个点,一共(609-1)//2
    img = Image.open('flag.png')
    pic = Image.new('RGBA',(609,609),(255,255,255,255))
    for i in range(304):
        table = get_round(i)
        ind = table.index((255,255,255,255))
        # print(ind)
        new_table = table[ind:] + table[:ind] #当时这里我一直是用两个循环去弄的,跟个傻子一样
        put_round(i,pic,new_table)
    pic.show()

ここに画像の説明を挿入

vnctf{3fd2f296-60cf-46d7-82b2-2f9949664ed7}

見栄えを良くするために、ここに小さな修理があります。

(後半は試合後の再発に属します)

ここでは、開始点が点(i、i)からのものであることがわかるため、白い線は斜めになっています。

次に、彼を横向きにする方法を見つけます。

しかし、ピンチ、それでも(i、i)ポイントから開始する必要があります。この場合、水平面または水平面に白いピクセルを作成するだけで済みます。

mainをこれに変更するだけです:

if __name__ == '__main__':
    # 除去最中间那个点,一共(609-1)//2
    img = Image.open('flag.png')
    pic = Image.new('RGBA',(609,609),(255,255,255,255))
    for i in range(304):
        table = get_round(i)
        ind = table.index((255,255,255,255))
        # print(ind)
        new_table = table[ind:] + table[:ind] #当时这里我一直是用两个循环去弄的,跟个傻子一样
        new_table = new_table[len(new_table)//8:] + new_table[:len(new_table)//8]
        put_round(i,pic,new_table)
    # pic.show()
    pic.save('real_flag.png')

ここに画像の説明を挿入

私はスーパーです!とても美しい
です。最初はコードがとても単純だと思われるかもしれませんが、
間違っています。
最初は、コードがデバッグされ、推測され、合計200行以上が書き込まれました。これは混乱です。
1人でも高レベルの操作を記述し、エラーを報告せずに白い画像で理由を知るのに15分かかりました。

                    for k in range(f,len(table)):
                        img.putpixel((i_2, j_2),table[f])

おすすめ

転載: blog.csdn.net/qq_42880719/article/details/122903690