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 演算を実行し、暗号文を取得します)RC4
key
enc
RC4
flag
alert
flag
RC4
s
s
s
s
256
RC4
S
Leaf
x
s
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 のメソッドはバイト文字列変数のみを受け入れることができます