๐Ÿ’ฐ CryptoLocker (2013) โ€” '๋ด‰์ธ๋œ ์—ด์‡ '๋ฅผ ์ฒ˜์Œ ํŒ”์•„๋„˜๊ธด ๋žœ์„ฌ์›จ์–ด

2026-10-10 ยท Malware Deep-Dive (Crypto-Ransomware / Gameover ZeuS Botnet / RSA-2048 + Bitcoin Extortion โ†’ Operation Tovar)
๊ธฐ์ˆ  ์ •๋ณด
  • ์•…์„ฑ์ฝ”๋“œ๋ช…: CryptoLocker (Trojan:Win32/Crilock.A ๊ณ„์—ด) โ€” ์ตœ์ดˆ์˜ ๋Œ€๊ทœ๋ชจ '๊ฐ•ํ•œ ์•”ํ˜ธ' ๋žœ์„ฌ์›จ์–ด
  • ๋“ฑ์žฅ: 2013๋…„ 9์›”(9/5 ์ „ํ›„ ์ตœ์ดˆ ๊ด€์ธก) โ€” Dell SecureWorksยทSymantecยทFireEye๊ฐ€ ์ž‡๋‹ฌ์•„ ๋ถ„์„ ๋ณด๊ณ 
  • ๋ฐฐํฌ(1์ฐจ ์นจํˆฌ): Gameover ZeuS(P2P ZeuS) ๋ด‡๋„ท โ†’ Cutwail ์ŠคํŒธ ๋ด‡๋„ท์ด ๋ฟŒ๋ฆฐ ZIP ์ฒจ๋ถ€(์ด์ค‘ ํ™•์žฅ์ž .pdf.exe)๊ฐ€ ์‹คํ–‰ ๋“œ๋กœํผ
  • ์•”ํ˜ธ ๊ตฌ์กฐ: ํŒŒ์ผ๋งˆ๋‹ค AES ๋Œ€์นญํ‚ค๋กœ ์•”ํ˜ธํ™” โ†’ ๊ทธ ๋Œ€์นญํ‚ค๋ฅผ ์•…์„ฑ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉ๋œ RSA-2048 ๊ณต๊ฐœํ‚ค๋กœ ๋ด‰์ธ โ†’ ๊ฐœ์ธํ‚ค๋Š” C2 ์„œ๋ฒ„์—๋งŒ ์กด์žฌ (ํ”ผํ•ด์ž๋Š” ์›๋ฆฌ์ ์œผ๋กœ ๋ณตํ˜ธ ๋ถˆ๊ฐ€)
  • ๋ชธ๊ฐ’ ์ฒญ๊ตฌ: ๋น„ํŠธ์ฝ”์ธ ๋˜๋Š” ์„ ๋ถˆ ๋ฐ”์šฐ์ฒ˜(MoneyPak/Ukash/CashU) ยท ์ฒ˜์Œ 2 BTC(โ‰ˆ$300) โ†’ ๊ธฐํ•œ ๊ฒฝ๊ณผ ์‹œ 10 BTC(โ‰ˆ$2,300)๋กœ ์ธ์ƒ ยท 72์‹œ๊ฐ„ ์นด์šดํŠธ๋‹ค์šด ํ›„ ๊ฐœ์ธํ‚ค ํŒŒ๊ธฐ ํ†ต๋ณด
  • ํ”ผํ•ด ๊ทœ๋ชจ: Dell SecureWorks ์ถ”์ • ์•ฝ 23๋งŒ~25๋งŒ ๋Œ€ ๊ฐ์—ผ, ์ฒซ ๋‘ ๋‹ฌ๊ฐ„ ๋ชธ๊ฐ’ ์•ฝ $2700๋งŒ โ€” 2013๋…„ ์ตœ๋Œ€ ์ˆ˜์ตํ˜• ์‚ฌ์ด๋ฒ„ ๋ฒ”์ฃ„
  • ์ข…๊ฒฐ: 2014๋…„ 6์›” 2์ผ 'Operation Tovar' โ€” ๋ฏธ FBIยท์œ ๋Ÿฝ Europolยท๋‹ค๊ตญ์  ์ˆ˜์‚ฌ๊ธฐ๊ด€ + ๋ฏผ๊ฐ„ ๋ณด์•ˆ์‚ฌ๊ฐ€ Gameover ZeuS P2P๋ง์„ ์‹ฑํฌํ™€ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ๋ฐฐํฌยทํ‚ค ์ „๋‹ฌ ๊ฒฝ๋กœ ์ฐจ๋‹จ

1. ๋ฐฐ๊ฒฝ/์—ญ์‚ฌ โ€” '์•”ํ˜ธ๋ฅผ ๋ชธ๊ฐ’์œผ๋กœ' ํŒ ์ฒซ ์„ธ๋Œ€

๋žœ์„ฌ์›จ์–ด ๊ฐœ๋… ์ž์ฒด๋Š” 1989๋…„ AIDS Trojan(์—์ด์ฆˆ ํŠธ๋กœ์ด๋ชฉ๋งˆ)๊นŒ์ง€ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€์ง€๋งŒ, ๊ทธ๊ฑด ์šฐํŽธ ๋””์Šค์ผ“์œผ๋กœ ๋ฐฐํฌ๋˜๊ณ  ์•”ํ˜ธ๊ฐ€ ํ—ˆ์ˆ ํ•ด ๊ณง ํ’€๋ ธ๋‹ค. 2000๋…„๋Œ€์˜ '๊ฐ€์งœ ๋ฐฑ์‹ (try & pay)'์€ ํŒŒ์ผ์„ ์ง€์šฐ๋Š” ์ฒ™๋งŒ ํ–ˆ์ง€ ์‹ค์ œ๋กœ ์•”ํ˜ธํ™”ํ•˜์ง€ ์•Š์•˜๋‹ค. CryptoLocker๊ฐ€ ๋“ฑ์žฅํ•œ 2013๋…„์— ์ด๋ฅด๋Ÿฌ์„œ์•ผ ์„ธ ๊ฐ€์ง€๊ฐ€ ๋™์‹œ์— ์„ฑ์ˆ™ํ–ˆ๋‹ค.

์™œ ์œ ๋ช…ํ•œ๊ฐ€: CryptoLocker๋Š” '๋žœ์„ฌ์›จ์–ด 1์„ธ๋Œ€'์˜ ๋ฌธ๋ฒ•์„ ์™„์„ฑํ–ˆ๋‹ค. ํŒŒ์ผ ์•”ํ˜ธํ™” โ†’ ๋ชธ๊ฐ’ ์ฒญ๊ตฌ โ†’ ์นด์šดํŠธ๋‹ค์šด โ†’ ๋ฏธ๋‚ฉ ์‹œ ํŒŒ๊ธฐ โ†’ ๋น„ํŠธ์ฝ”์ธ ๊ฒฐ์ œ. ๊ทธ ๋’ค์— ๋‚˜์˜จ CryptoWallยทTorrentLockerยทLockyยทPetyaยทWannaCryยทRyukยทContiยทLockBit์€ ๋ชจ๋‘ ์ด ๋ฌธ๋ฒ•์„ ๋ฌผ๋ ค๋ฐ›์•˜๋‹ค. ์ด ๊ธ€์—์„œ ๋‹ค๋ฃฌ ์  ์žˆ๋Š” WannaCryยทNotPetya๊ฐ€ '์›œํ˜• ์žฌ๋‚œ'์ด๋ผ๋ฉด, CryptoLocker๋Š” '๊ณผ๊ธˆ ๋ชจ๋ธ์˜ ์›ํ˜•'์ด๋‹ค.

2. ๊ฐ์—ผยท์ „ํŒŒ ๊ฒฝ๋กœ โ€” ๋ด‡๋„ท์ด ์ด ์ค€ ์ŠคํŒธ, ์‹คํ–‰๋˜๋Š” ์ˆœ๊ฐ„ ์ž ๊ธด๋‹ค

CryptoLocker๋Š” ์Šค์Šค๋กœ ํผ์ง€์ง€ ์•Š๋Š”๋‹ค(์›œ๊ณผ ๊ฒฐ์ •์  ์ฐจ์ด). ๋Œ€์‹  ์ด๋ฏธ ๊ฐ์—ผ๋œ ๋ด‡๋„ท์ด '์šด๋ฐ˜์ฑ…'์ด์—ˆ๋‹ค.

โš ๏ธ ๊ต์œก์šฉ ์ฃผ์˜: ์•„๋ž˜ PoC๋Š” ์ธํ„ฐ๋„ท๊ณผ ๋ถ„๋ฆฌ๋œ ๋กœ์ปฌ ๊ฒฉ๋ฆฌ ๋žฉ(/tmp/lab ๋””๋ ‰ํ„ฐ๋ฆฌ)์„ ์ „์ œ๋กœ, '๋™์ž‘ ์›๋ฆฌ'๋งŒ ์žฌํ˜„ํ•˜๋Š” ๋ชจ์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ CryptoLocker ํŽ˜์ด๋กœ๋“œยท์‹ค์ œ C2 ํ†ต์‹ ยท์‹ค์ œ ๋ชธ๊ฐ’ ์ฒญ๊ตฌยท์‹ค์ œ ํ‚ค ํŒŒ๊ธฐ๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์‹œ์Šคํ…œยทํƒ€์ธ ์ž์‚ฐ์— ๋Œ€ํ•œ ์•”ํ˜ธํ™”ยท๊ฐˆ์ทจ๋Š” ๊ทธ ์ž์ฒด๋กœ ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค.

3. ๋™์ž‘ ์›๋ฆฌ ์ƒ์„ธ ๋ถ„์„ โ€” '๋ด‰์ธ'๋œ ์—ด์‡ ๊ฐ€ ๋ชธ๊ฐ’์˜ ๊ทผ๊ฑฐ๋‹ค

ํ•ต์‹ฌ์€ ํ‚ค ๊ด€๋ฆฌ(key management)๋‹ค. ํ‰์ƒ ์•”ํ˜ธํ•™์„ ๋‹ค๋ฃจ์ง€ ์•Š์€ ๊ณต๊ฒฉ์ž๋„, ์•„๋ž˜ ๊ตฌ์กฐ๋งŒ ๊ฐ–์ถ”๋ฉด ์‚ฌ์‹ค์ƒ ๊นฐ ์ˆ˜ ์—†๋Š” ๋ชธ๊ฐ’์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. CryptoLocker์˜ ์„ค๊ณ„๋Š” ๋Œ€๋žต ์ด๋Ÿฌํ–ˆ๋‹ค(๊ณต๊ฐœ ๋ถ„์„ ๊ธฐ๋ฐ˜ ์žฌ๊ตฌ์„ฑ).

๊ธฐ์ˆ ์ ์œผ๋กœ ๋ˆˆ์—ฌ๊ฒจ๋ณผ ์ : CryptoLocker๋Š” ์•”ํ˜ธ๋ฅผ ๊นจ์„œ ๋ฌด๋ ฅํ™”ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์œ ํ†ต ๋ด‡๋„ท(Gameover ZeuS)์„ ๋ฌด๋ ฅํ™”ํ•ด์„œ ์ด๊ฒผ๋‹ค. ๋žœ์„ฌ์›จ์–ด ๋ฐฉ์–ด์˜ ๋‘ ์ถ• โ€” ์•”ํ˜ธ/๋ฐฑ์—…(๋ณต๊ตฌ๋ ฅ)๊ณผ ์œ ํ†ต๋ง/์นจํˆฌ ์ฐจ๋‹จ(์˜ˆ๋ฐฉ๋ ฅ) โ€” ์ด ์™œ ๋™์‹œ์— ํ•„์š”ํ•œ์ง€ ๋ณด์—ฌ์ฃผ๋Š” ์‚ฌ๋ก€๋‹ค.

4. ํ”ผํ•ด ๊ทœ๋ชจ/์˜ํ–ฅ โ€” '๋žœ์„ฌ์›จ์–ด ์‚ฐ์—…'์ด ์—ด๋ฆฌ๋‹ค

5. ๊ต์œก์šฉ PoC 4์ข… โ€” ์›๋ฆฌ๋งŒ ์žฌํ˜„ํ•˜๋Š” ๋ชจ์˜ ์ฝ”๋“œ

์•„๋ž˜ ์Šค๋‹ˆํŽซ์€ ์•Œ๋ ค์ง„ ๊ณต๊ฐœ ๋ถ„์„์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ ์žฌ๊ตฌ์„ฑ์ด๋ฉฐ, ๊ฐ€์ƒ์˜ ๋กœ์ปฌ ์‹ค์Šต ๋””๋ ‰ํ„ฐ๋ฆฌ /tmp/lab์—์„œ๋งŒ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“  ๊ต์œก์šฉ ๋ชจ์˜ ์ฝ”๋“œ๋‹ค. ์‹ค์ œ ์œ ํฌ์šฉ ๋“œ๋กญํผ๋‚˜ ๊ฐˆ์ทจ ์ ˆ์ฐจ๋Š” ์—†๋‹ค.

PoC 1 โ€” ํ‘œ์  ํŒŒ์ผ ์—ด๊ฑฐ(ํ‘œ์ ํ™” ๋กœ์ง). ๋žœ์„ฌ์›จ์–ด๋Š” ๋ฌด์ž‘์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ€์น˜ ์žˆ๋Š” ํ™•์žฅ์ž๋ฅผ ๊ณจ๋ผ ์•”ํ˜ธํ™”ํ•œ๋‹ค.

# PoC 1: ํ‘œ์  ํ™•์žฅ์ž ์—ด๊ฑฐ โ€” "๋ฌด์—‡์„ ๋…ธ๋ฆฌ๋Š”๊ฐ€"๋งŒ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์‹œ (/tmp/lab ํ•œ์ •)
import os

TARGET_EXT = {".doc", ".docx", ".xls", ".xlsx", ".pdf", ".jpg", ".png",
              ".txt", ".zip", ".sql", ".ppt", ".pptx", ".csv"}

def enumerate_targets(root="/tmp/lab"):
    hits = []
    for dirpath, _dirs, files in os.walk(root):
        for f in files:
            if os.path.splitext(f)[1].lower() in TARGET_EXT:
                hits.append(os.path.join(dirpath, f))
    return hits

if __name__ == "__main__":
    # ์‹ค์Šต ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋จผ์ € ์ค€๋น„: mkdir -p /tmp/lab && echo hi > /tmp/lab/a.txt
    for p in enumerate_targets():
        print("[ํ‘œ์ ]", p)
    print("์ด ํ‘œ์  ์ˆ˜:", len(enumerate_targets()))

PoC 2 โ€” '๋ด‰์ธ๋œ ์—ด์‡ ' ๊ตฌ์กฐ(ํ‚ค ๊ด€๋ฆฌ ํ•ต์‹ฌ). ์‹ค์ œ CryptoLocker์˜ ์‹ฌ์žฅ๋ถ€๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์žฌํ˜„ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋„คํŠธ์›Œํฌ๋กœ ํ‚ค๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ๋กœ์ปฌ์—์„œ RSA๋กœ ๋Œ€์นญํ‚ค๋ฅผ ๊ฐ์‹ธ๋Š” ๊ฒƒ๊นŒ์ง€๋งŒ ๋ณด์—ฌ์ค€๋‹ค.

# PoC 2: ๋Œ€์นญํ‚ค ์ƒ์„ฑ โ†’ RSA ๊ณต๊ฐœํ‚ค๋กœ '๋ด‰์ธ'(wrap) โ€” ์‹ค์ œ ๊ฐˆ์ทจ/์†ก์‹ ์€ ์—†์Œ
# ํ•„์š”: pip install cryptography   (๊ต์œก์šฉ ๋กœ์ปฌ ์‹คํ–‰ ์ „์šฉ)
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes

# --- ๊ณต๊ฒฉ์ž ์ธก: ํ‚ค์Œ ์ค€๋น„. ์‹ค์ œ๋กœ๋Š” RSA-2048 '๊ณต๊ฐœํ‚ค'๋งŒ ์•…์„ฑ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉ๋จ ---
attacker_private = rsa.generate_private_key(public_exponent=65537, key_size=2048)
attacker_public  = attacker_private.public_key()   # ์ด ๊ณต๊ฐœํ‚ค๋งŒ ๋ฐฐํฌ๋œ๋‹ค

def encrypt_one(plaintext: bytes):
    # (1) ํŒŒ์ผ๋งˆ๋‹ค ๋ฌด์ž‘์œ„ AES-256 ๋Œ€์นญํ‚ค ์ƒ์„ฑ
    sym_key = AESGCM.generate_key(bit_length=256)
    nonce    = os.urandom(12)
    ciphertext = AESGCM(sym_key).encrypt(nonce, plaintext, None)
    # (2) ๊ทธ ๋Œ€์นญํ‚ค๋ฅผ RSA ๊ณต๊ฐœํ‚ค๋กœ '๋ด‰์ธ' โ†’ ๊ฐœ์ธํ‚ค ์—†์ด๋Š” ๋ชป ์—ถ
    wrapped = attacker_public.encrypt(
        sym_key,
        padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
                     algorithm=hashes.SHA256(), label=None))
    # ์‹ค์ œ ์•…์„ฑ์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์„œ wrapped ๋ฅผ C2๋กœ ์ „์†กํ•˜๊ณ  ๋กœ์ปฌ ํ‚ค๋Š” ์ง€์šด๋‹ค.
    return nonce, ciphertext, wrapped

# --- ํ”ผํ•ด์ž ์ธก: ๊ฐœ์ธํ‚ค๊ฐ€ ์—†์œผ๋ฉด ์›๋ฆฌ์ ์œผ๋กœ ๋ณต๊ตฌ ๋ถˆ๊ฐ€ ---
def decrypt_one(nonce, ciphertext, wrapped, private_key):
    sym_key = private_key.decrypt(
        wrapped,
        padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
                     algorithm=hashes.SHA256(), label=None))
    return AESGCM(sym_key).decrypt(nonce, ciphertext, None)

if __name__ == "__main__":
    n, ct, w = encrypt_one(b"educational-demo-only")
    print("[๋ณตํ˜ธํ™” ์‹œ๋„ โ€” ๊ฐœ์ธํ‚ค ๋ณด์œ  ์‹œ]", decrypt_one(n, ct, w, attacker_private))
    try:
        decrypt_one(n, ct, w, rsa.generate_private_key(public_exponent=65537, key_size=2048))
    except Exception as e:
        print("[๋ณตํ˜ธํ™” ์‹œ๋„ โ€” ๋‹ค๋ฅธ ํ‚ค ์‚ฌ์šฉ ์‹œ] ์‹คํŒจ:", type(e).__name__)

PoC 3 โ€” ์นด์šดํŠธ๋‹ค์šดยท๋ชธ๊ฐ’ ์ธ์ƒ(์‚ฌํšŒ๊ณตํ•™ ๋กœ์ง). ์•…์„ฑ์ฝ”๋“œ์˜ '์˜์—…' ๋ถ€๋ถ„์€ ์‹ฌ๋ฆฌ ์„ค๊ณ„๋‹ค.

# PoC 3: 72์‹œ๊ฐ„ ์นด์šดํŠธ๋‹ค์šด + ๊ธฐํ•œ ๊ฒฝ๊ณผ ์‹œ ๊ฐ€๊ฒฉ ์ธ์ƒ(๋ชจ์˜). ์‹ค์ œ ๊ฒฐ์ œ/ํŒŒ๊ธฐ๋Š” ์—†์Œ.
import time

def ransom_message(elapsed_hours: float) -> str:
    deadline = 72
    left = deadline - elapsed_hours
    price  = 2 if left > 0 else 10      # BTC: ๊ธฐํ•œ ๋‚ด 2, ์ดˆ๊ณผ 10
    if left > 0:
        return f"[๋ชจ์˜] ๋ชธ๊ฐ’ {price} BTC ยท ๋‚จ์€ ์‹œ๊ฐ„ {left:.1f}h โ€” ๊ฒฐ์ œํ•˜๋ฉด ๋ณต๊ตฌ ํ‚ค๋ฅผ ์ค€๋‹ค(์ฒ™)."
    return f"[๋ชจ์˜] ๊ธฐํ•œ ์ดˆ๊ณผ โ€” ๋ชธ๊ฐ’ {price} BTC๋กœ ์ธ์ƒ. ๊ฐœ์ธํ‚ค๋Š” ํŒŒ๊ธฐ๋๋‹ค๊ณ  ์ฃผ์žฅํ•œ๋‹ค(์ฒ™)."

if __name__ == "__main__":
    for h in (0, 30, 71.9, 72.1):
        print(ransom_message(h))

PoC 4 โ€” ๋ฐฉ์–ด ๊ฒ€์ฆ(๋ณต๊ตฌ๋ ฅ ํ…Œ์ŠคํŠธ). ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๋Œ€์‘์€ '๋ชธ๊ฐ’์„ ์•ˆ ๋‚ด๊ณ  ๋˜์‚ด๋ฆฌ๊ธฐ'๋‹ค. ๋ฐฑ์—…์ด ์‹ค์ œ๋กœ ๋ณต๊ตฌ๋˜๋Š”์ง€๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ๋ชจ์˜ ์Šคํฌ๋ฆฝํŠธ.

# PoC 4: ๋ฐฑ์—… ๋ณต๊ตฌ ๋ฆฌํ—ˆ์„ค โ€” '๋ณต์›ํ•ด ๋ด์•ผ ๋ฐฑ์—…์ด๋‹ค'
import hashlib, os, shutil

def sha(p):
    return hashlib.sha256(open(p, "rb").read()).hexdigest()

def drill(live_dir="/tmp/lab", backup_dir="/tmp/lab_backup"):
    # 1) ์›๋ณธ ์Šค๋ƒ…์ƒท
    originals = {f: sha(os.path.join(live_dir, f)) for f in os.listdir(live_dir)}
    # 2) ์žฌํ•ด ์‹œ๋‚˜๋ฆฌ์˜ค: ์›๋ณธ์„ ์ง€์› ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋ฐฑ์—…์—์„œ ๋ณต์›
    for f in originals:
        shutil.copy(os.path.join(backup_dir, f), os.path.join(live_dir, f))
    # 3) ๋ฌด๊ฒฐ์„ฑ ๋Œ€์กฐ โ€” ํ•ด์‹œ๊ฐ€ ๋ชจ๋‘ ์ผ์น˜ํ•ด์•ผ '๋ณต๊ตฌ ๊ฐ€๋Šฅ' ์ƒํƒœ
    ok = all(sha(os.path.join(live_dir, f)) == h for f, h in originals.items())
    print("[๋ฆฌํ—ˆ์„ค]", "๋ณต๊ตฌ ๊ฐ€๋Šฅ โœ”" if ok else "๋ณต๊ตฌ ์‹คํŒจ โœ˜ โ€” ๋ฐฑ์—…์„ ์‹ ๋ขฐํ•˜์ง€ ๋ง ๊ฒƒ")
    return ok

# ์‹ค์Šต ์ค€๋น„:
#   mkdir -p /tmp/lab /tmp/lab_backup
#   echo demo > /tmp/lab/a.txt && cp /tmp/lab/a.txt /tmp/lab_backup/
if __name__ == "__main__":
    drill()

6. ๋ฐฉ์–ด ๋ฐฉ๋ฒ•/๊ตํ›ˆ โ€” '๋ณต๊ตฌ๋ ฅ'๊ณผ '์œ ํ†ต๋ง ์ฐจ๋‹จ' ๋‘ ์ถ•

7. ์ถœ์ฒ˜

โ€ป ๋ณธ๋ฌธ์˜ PoC ์ฝ”๋“œ๋Š” ๊ตฌ์กฐ ์ดํ•ด ๋ชฉ์ ์˜ ๊ต์œก์šฉ ๋ชจ์˜ ์ฝ”๋“œ์ด๋ฉฐ, ์‹ค์ œ ์œ ํฌ์šฉ ๋“œ๋กœํผยท์‹ค์ œ C2ยท์‹ค์ œ ๋ชธ๊ฐ’ ์ฒญ๊ตฌยท์‹ค์ œ ํ‚ค ํŒŒ๊ธฐ ์ ˆ์ฐจ๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‹ค์Šต์€ ์ธํ„ฐ๋„ท๊ณผ ๋ถ„๋ฆฌ๋œ ๊ฒฉ๋ฆฌ ๋žฉ(/tmp/lab)์„ ์ „์ œ๋กœ ํ•˜๋ฉฐ, ์‹ค์ œ ์‹œ์Šคํ…œยทํƒ€์ธ ์ž์‚ฐ์— ๋Œ€ํ•œ ์‹คํ–‰ยท๊ฐˆ์ทจ๋Š” ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค.

ํ•จ๊ป˜ ์ฝ๊ธฐ: ๐Ÿ’€ WannaCry (2017) โ€” CryptoLocker๊ฐ€ ์—ฐ ๋žœ์„ฌ์›จ์–ด ์‹œ๋Œ€๋ฅผ '์›œ'์œผ๋กœ ์ฆํญ์‹œํ‚จ ์‚ฌ๊ฑด ยท โ˜ ๏ธ NotPetya (2017) โ€” ๊ณผ๊ธˆ์„ ํฌ๊ธฐํ•˜๊ณ  ํŒŒ๊ดด๋ฅผ ํƒํ•œ ์™€์ดํผ ยท ๐Ÿฆ Zeus / Zbot (2007โ€“2014) โ€” CryptoLocker์˜ ์œ ํ†ต๋ง์ด์—ˆ๋˜ ๋ฑ…ํ‚น ํŠธ๋กœ์ด๋ชฉ๋งˆ ยท ๐Ÿ› Morris Worm (1988) โ€” ์ตœ์ดˆ์˜ ์ž๊ธฐ๋ณต์ œ ์›œ์—์„œ ์‹œ์ž‘๋œ ์•…์„ฑ์ฝ”๋“œ ๊ณ„๋ณด

๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ