Đề bài

Giải
Đọc source code trước
# Python obfuscation by freecodingtools.org
_ = lambda __ : __import__('zlib').decompress(__import__('base64').b64decode(__[::-1]));exec((_)(b'==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'))
Nhận thấy đây chỉ là mã base64 bị ngược thôi
Script
#!/usr/bin/env python3
import re
import base64
import zlib
import argparse
PATTERN = re.compile(r"exec\(\(_\)\(b(?P<q>['\"])(?P<payload>.*?)(?P=q)\)\)", re.DOTALL)
def peel(text: str, max_layers: int = 1000):
layers = 0
lengths = []
while layers < max_layers:
m = PATTERN.search(text)
if not m:
break
payload_str = m.group('payload')
payload = payload_str.encode('utf-8')
try:
# Mỗi lớp: đảo chuỗi Base64 -> base64 decode -> zlib decompress
decoded = zlib.decompress(base64.b64decode(payload[::-1]))
except Exception as e:
raise RuntimeError(f"Lớp {layers+1} giải mã lỗi: {e}")
text = decoded.decode('utf-8', errors='replace')
layers += 1
lengths.append(len(payload_str))
return text, layers, lengths
def main():
ap = argparse.ArgumentParser(description="Giải mã chuỗi obfuscation kiểu reverse+base64+zlib lồng nhau.")
ap.add_argument('input', help="Đường dẫn tới file Python bị obfuscate (vd: obs.py)")
ap.add_argument('-o', '--output', default='decoded.py', help="Lưu mã đã giải mã vào file này (mặc định: decoded.py)")
args = ap.parse_args()
with open(args.input, 'r', encoding='utf-8', errors='ignore') as f:
src = f.read()
decoded, n_layers, lens = peel(src)
with open(args.output, 'w', encoding='utf-8') as f:
f.write(decoded)
print(f"Đã giải {n_layers} lớp. Đã lưu vào: {args.output}")
if decoded:
print("\n--- Head ---\n", decoded[:200])
print("\n--- Tail ---\n", decoded[-200:])
if __name__ == '__main__':
main()
Run
python decoder.py obs.py -o decoded.py
Đã giải 64 lớp. Đã lưu vào: decoded.py
--- Head ---
flag = "v1t{d4ng_u_kn0w_pyth0n_d3bugg}"
inp = input("Input the flag: ")
if (inp != flag):
print("wrong")
else:
print("correct")
--- Tail ---
flag = "v1t{d4ng_u_kn0w_pyth0n_d3bugg}"
inp = input("Input the flag: ")
if (inp != flag):
print("wrong")
else:
print("correct")
Flag
Flag: v1t{d4ng_u_kn0w_pyth0n_d3bugg}
'WriteUp > RE' 카테고리의 다른 글
| Cosmonaut - BuckeyeCTF 2025 (0) | 2025.11.09 |
|---|---|
| Square Cipher - BuckeyeCTF 2025 (0) | 2025.11.09 |
| [RE] Clockwork - EnigmaXplore 3.0 (0) | 2025.10.20 |
| [RE] S0urc3 - POC CTF 2025 (0) | 2025.10.13 |
| [RE] Dsp - POC CTF 2025 (0) | 2025.10.13 |
