2023VNCTF-PZギャラクシー

サンプルリンク - PZGalaxy

1.環境を構築する

(実際には、これは役に立ちません。コード ロジックを理解するのに役立ちます)
現在のフォルダーでコマンドを使用します。

python2 -m SimpleHTTPServer
python3 -m http.server

2. トピックの主なコード ロジック:

<!DOCTYPE html>
<html>
  <body>
    <script>
    function Leaf(k, p) {
     
     
      var s = [], j = 0, x, res = '';
      for (var i = 0; i < 256; i++) {
     
     
        s[i] = i;
      }
      for (i = 0; i < 256; i++) {
     
     
        j = (j + s[i] + k.charCodeAt(i % k.length)) % 256;
        x = s[i];
        s[i] = s[j];
        s[j] = x;
      }
      i = 0;
      j = 0;
      for (var y = 0; y < p.length; y++) {
     
     
        i = (i + 1) % 256;
        j = (j + s[i]) % 256;
        x = s[i];
        s[i] = s[j];
        s[j] = x;
        res += String.fromCharCode(p.charCodeAt(y) ^ s[(s[i] + s[j]) % 256]);
      }
      return res;
    }
    
    form.addEventListener("submit", (ev) => {
     
     
      ev.preventDefault();
      var date = document.getElementById('date').value;
      var enc = ['¦', 'p', ':', 'Ü','\x92', 'Ã', '\x97', 'ó', '\x1A', 'ß', '\b', 'Ö', 'A', ' ', '5', '\x90', '{', '\x06', 'Ô', '÷', 's', '_', '\x1D', ':', 'I', 'L', 'C', 'X', 'Ñ', '¹', 'O', '\x99', '\x85', '3', 'à', 'i', '|'];
      flag = Leaf(date, enc.join(''));
      if ( flag.substring(0, 5) == "VNCTF" && date.length == 8 && date.su
bstring(0,4) == '2023' )){
     
     
        Galaxy('Neko.jpg', 50);
        alert(flag);
      } else{
     
     
        Galaxy('Fish.jpg', 50);
        alert("鱼怎么抓痒?");}
    })
    </script>
  </body>
</html>

日付を取得し、RC4暗号化 (Leaf関数) を使用し、それをキーdateとして使用し平文として使用します (対称暗号化アルゴリズム。名前は関係ありません)。アルゴリズムの後は、正しい日付を入力するだけで取得できます。正しいもの(暗号化アルゴリズムの特徴: ①変数を使用し、ボックス内のボックスを参照し、ボックスに対応する s 配列の長さは次のとおりです。 ②暗号化プロセス中、アルゴリズムはボックスとボックスを継続的に更新することにより、擬似乱数シーケンスを生成します。要素の交換、に対応します。関数内には、一時変数を使用してボックス要素を交換する場所もあります。 ③最後に、生成された擬似乱数列を使用して、平文に対してビットごとの XOR 演算を実行し、暗号文を取得します)RC4keyencRC4flagalertflag

RC4
ssss256
RC4SLeafxs

3、exp.py

import datetime
# enc = ['¦', 'p', ':', 'Ü','\x92', 'Ã', '\x97', 'ó', '\x1A', 'ß', '\b', 'Ö', 'A', ' ', '5', '\x90', '{', '\x06', 'Ô', '÷', 's', '_', '\x1D', ':', 'I', 'L', 'C', 'X', 'Ñ', '¹', 'O', '\x99', '\x85', '3', 'à', 'i', '|']
enc = ['¦', 'p', ':', 'Ü','\x92', 'Ã', '\x97', 'ó', '\x1A', 'ß', '\b', 'Ö', 'A', ' ', '5', '\x90', '{', '\x06', 'Ô', '÷', 's', '_', '\x1D', ':', 'I', 'L', 'C', 'X', 'Ñ', '¹', 'O', '\x99', '\x85', '3', 'à', 'i', '|']
for m in range(1, 13):
    for d in range(1, 32):
        try:
            key = '2023{:02d}{:02d}'.format(m, d)
            s = list(range(256))
            j = 0
            for i in range(256):
                j = (j + s[i] + ord(key[i % len(key)])) % 256
                s[i], s[j] = s[j], s[i]
            i = j = 0
            res = ''
            for c in enc:
                i = (i + 1) % 256
                j = (j + s[i]) % 256
                s[i], s[j] = s[j], s[i]
                res += chr(ord(c) ^ s[(s[i] + s[j]) % 256])
            if 'flag' in res:
                print('Found key:', key)
                print('Plaintext:', res)
                break
        except:
            pass

Cypto ライブラリを使用する別の方法

from Crypto.Cipher import ARC4
# enc = [b'\xa6', b'p', b':', b'\xdc', b'\x92', b'\xc3', b'\x97', b'\xf3', b'\x1a', b'\xdf', b'\x08', b'\xd6', b'A', b' ', b'5', b'\x90', b'{', b'\x06', b'\xd4', b'\xf7', b's', b'_', b':', b'I', b'L', b'C', b'X', b'\xd1', b'\xb9', b'O', b'\x99', b'\x85', b'3', b'\xe0', b'i', b'|']
enc = ['¦', 'p', ':', 'Ü','\x92', 'Ã', '\x97', 'ó', '\x1A', 'ß', '\b', 'Ö', 'A', ' ', '5', '\x90', '{', '\x06', 'Ô', '÷', 's', '_', '\x1D', ':', 'I', 'L', 'C', 'X', 'Ñ', '¹', 'O', '\x99', '\x85', '3', 'à', 'i', '|']
enc = bytes([ord(c) for c in enc])
for m in range(1, 13):
    for d in range(1, 32):
        try:
            key = '2023{:02d}{:02d}'.format(m, d)
            cipher = ARC4.new(key.encode())
            res = cipher.decrypt(enc)
            if b'flag{' in res:
                print('Found key:', key)
                print('Plaintext:', res)
                break
        except:
            pass

ps: ARC4 のメソッドはバイト文字列変数のみを受け入れることができます

おすすめ

転載: blog.csdn.net/weixin_52111404/article/details/129676544