# Intro.
2025. 03. 29. ํ ์์ผ์ ๊ฐ์ต๋ 2025 Codegate CTF์ ์ฐธ๊ฐํ๋ค
์ด ๋ํ๋ ๋ด๊ฐ ์๋ ์ ์ฒ์์ผ๋ก ์ฐธ๊ฐํด๋ณธ ์ธ๋ถ CTF์ด๊ณ , ๊ท๋ชจ๊ฐ ์ปธ๋ ๋ํ๋ผ์ ๊ธฐ์ต์ ๋จ๋๋ค
๊ทธ๋์ ํ์๋ ์จฐ๊ณ ์๋ฅํด์ ํ ์์ผ ๋ํ์ ์ฐธ๊ฐํ๋ค
๋์ถฉ ๋ฌธ์ ํ์ดํ๊ณ ํ๊ธฐ ์ ๊ฒ ๋ค
# Result.
์์ ํ๋ฝํ๋ค
์์์,,์กฐ๊ธ์ ํ์ง๋ง, ์ด๋ด์ค์ ๋ชฐ๋๋ค

4๋ฌธ์ ํ์ด์ 1250์ . 44๋ฑ.
์๋ 60๋ช๋ฑ.
ํ๊ณ ์ถ์ ๋ง์ ๋ง์ง๋ง, ํ์ดํ ๋ฌธ์ ๋ ๋ง์ด ์์ง๋ง ํ์ด ๋์ถฉ ๊ธฐ๋ก๋ง ํด๋๊ณ ํ๊ธฐ๋ฅผ ์ ๊ฒ ๋ค (+ ์์ผ๋ก ๊ณต๋ถ ๋ฐฉํฅ์ฑ)
# Hello Codegate
๊ทธ๋ฅ ๊ณต์ง์ ๋ค์ด๊ฐ๋ฉด ์๋ค
ํ๋๊ทธ๋ ๊ธฐ์ต์ด ์๋จ
# inital - rev
๊ทธ๋ฅ ๊ณต์ง์ ๋ค์ด๊ฐ๋ฉด ์๋ค



์์ฒญ ๋ณต์กํด๋ณด์ด์ง ์๋๋ค
"๋ธ๊น"
byte_4020 = [
0x45, 0xB8, 0x1A, 0x80, 0x47, 0xCB, 0xD6, 0x19, 0x1D, 0x58,
0x56, 0xE2, 0x36, 0xE4, 0x27, 0x65, 0xB1, 0x73, 0xE9, 0x5C,
0x7E, 0x42, 0x7C, 0xDE, 0x71, 0x61, 0xF6, 0x48, 0xF5, 0x22,
0x57, 0x1B, 0xAF, 0xDB, 0x8D, 0x8B, 0xC0, 0x2B, 0xD4, 0xA1,
0xCC, 0xF2, 0xEB, 0xBE, 0x37, 0x38, 0xD9, 0x1E, 0x63, 0xE3,
0x4D, 0x94, 0x13, 0xBA, 0x9C, 0x86, 0x10, 0x35, 0xFC, 0x4F,
0xD7, 0xD3, 0x7B, 0x3A, 0xC9, 0x8F, 0xD0, 0x24, 0xF1, 0x05,
0x2C, 0x53, 0x5E, 0x8C, 0x96, 0x3D, 0xA6, 0xA4, 0x6E, 0xCF,
0x5B, 0x6D, 0x04, 0xED, 0x12, 0x7A, 0x17, 0x25, 0x34, 0xDC,
0xAD, 0xE1, 0x20, 0x91, 0x75, 0x06, 0xC4, 0x74, 0x6F, 0x78,
0x00, 0x6C, 0xC2, 0xAB, 0xA9, 0x9F, 0xB0, 0x16, 0x33, 0x90,
0xCD, 0xB2, 0x3C, 0xAA, 0x9B, 0x51, 0x4E, 0x3F, 0x1C, 0x50,
0xFA, 0x18, 0xE8, 0xB4, 0x54, 0xB9, 0x3B, 0x49, 0xF9, 0xB6,
0x99, 0x9D, 0x7D, 0x0E, 0x66, 0xEF, 0xFF, 0x15, 0x97, 0x55,
0x0F, 0xF8, 0x21, 0x2E, 0x83, 0xF3, 0x95, 0x0A, 0xA8, 0xBC,
0x5D, 0xB5, 0x32, 0xFD, 0xF7, 0xD8, 0x26, 0x89, 0x64, 0x2F,
0xA7, 0xCA, 0x0D, 0xEC, 0xC3, 0xFB, 0xAC, 0xB7, 0x09, 0xEE,
0x84, 0x92, 0x79, 0x01, 0x07, 0xA2, 0x77, 0x4A, 0x02, 0x60,
0x39, 0xA0, 0x93, 0xBD, 0x88, 0xC6, 0xE5, 0xE7, 0xCE, 0x23,
0xBB, 0xDF, 0x85, 0xC1, 0x59, 0xEA, 0xD2, 0x9A, 0xE6, 0x31,
0x14, 0xFE, 0xC5, 0x44, 0x11, 0x87, 0x67, 0xD1, 0x4B, 0xDA,
0x6A, 0x52, 0xBF, 0x0B, 0xF4, 0x5A, 0x8A, 0x08, 0x28, 0xA3,
0x7F, 0x30, 0x70, 0x9E, 0x2D, 0x0C, 0x82, 0xAE, 0x40, 0x68,
0x43, 0x76, 0xE0, 0x3E, 0x8E, 0x2A, 0x4C, 0xA5, 0xD5, 0x69,
0x72, 0xC8, 0x81, 0x6B, 0x46, 0xC7, 0xB3, 0x1F, 0x5F, 0x98,
0x29, 0xF0, 0x62, 0x03, 0xDD, 0x41
]
byte_4120 = [
0x36, 0xE2, 0x2E, 0x86, 0x6D, 0x24, 0xCD, 0x94, 0x1A, 0x1A,
0x46, 0x9B, 0x49, 0x83, 0x61, 0x15, 0x20, 0xB2, 0x47, 0xEA,
0x0D, 0x42, 0xE9, 0x3D, 0xE4, 0x74, 0x1B, 0x16, 0x8B, 0x54,
0x2E, 0xAA
]
def rotate_left(val, shift, bits=8):
shift %= bits
return ((val << shift) | (val >> (bits - shift))) & ((1 << bits) - 1)
# Reverse the sub_11A9 transformation
s_after_xor = []
for j in range(32):
rot_amount = j & 6
rotated_val = rotate_left(byte_4120[j], rot_amount)
try:
original_byte = byte_4020.index(rotated_val)
s_after_xor.append(original_byte)
except ValueError:
print(f"Error: Could not find {rotated_val} in byte_4020 at j={j}")
exit()
# Reverse the XOR transformation
xor_sum = 0
for i in range(31):
xor_sum ^= s_after_xor[i]
original_s0 = s_after_xor[31] ^ xor_sum ^ s_after_xor[0]
original_s = [0] * 32
original_s[0] = original_s0
current_xor = original_s[0]
for i in range(1, 32):
original_s[i] = current_xor ^ s_after_xor[i - 1]
current_xor = original_s[i]
# Verify the last XOR
assert (original_s[31] ^ s_after_xor[0]) == s_after_xor[31], "Verification failed"
# Convert to flag
flag = bytes(original_s).decode('latin-1')
print(f"Flag: {flag}")

# Encrypted_flag - crypto


๊ฑ ๋ณต๊ตฌํด์ฃผ๋ฉด ๋๋ค
import math
from sympy import nextprime
from Crypto.Util.number import long_to_bytes, inverse
n = 54756668623799501273661800933882720939597900879404357288428999230135977601404008182853528728891571108755011292680747299434740465591780820742049958146587060456010412555357258580332452401727868163734930952912198058084689974208638547280827744839358100210581026805806202017050750775163530268755846782825700533559
e = 65537
c = 7728462678531582833823897705285786444161591728459008932472145620845644046450565339835113761143563943610957661838221298240392904711373063097593852621109599751303613112679036572669474191827826084312984251873831287143585154570193022386338846894677372327190250188401045072251858178782348567776180411588467032159
approx = math.isqrt(n)
while True:
if n % approx == 0:
p = approx
q = n // p
break
approx -= 1
phi = (p - 1) * (q - 1)
d = inverse(e, phi)
m = pow(c, d, n)
flag = long_to_bytes(m)
print("Recovered flag:", flag)

# ping_tester - web
๊ทธ์ commend injection

์๋ฒ ๋ซํ์ ๊ธฐ์ต์ ์๋๋๋ฐ ls; cat flag๋ญ ์ด๋ฐ์์ผ๋ก ํ๋๊ฒ ๊ฐ๋ค
์ฌ๊ธฐ๊น์ง ๋ํ ๊ธฐ๊ฐ๋์ ํผ ๋ฌธ์
๋ํ ์ดํ ์ ์๋น or ํ์ด ๋ฐฉ๋ฒ์ ํ์คํ๊ฒ ์ ๋ฌธ์ ๋ฑ๋ฑ (๋ชปํผ๊ฑฐ)
# Bright - AI
์ด ๋ฌธ์ ์ 12์๊ฐ์ ํฌ์ํ๋ค
์ ์ฌ์๊ฐ๋ถํฐ ์ด ๋ฌธ์ ๋ฅผ ๋ณด์๋๋ฐ ๋์ถฉ ๋ญ ์๊ตฌํ๋์ง ์๊ฒ ๊ฐ์๊ณ , ํ ์ ์์ ์ค ์์๋ค
ํ์ด์๊ฐ 0๋ช ์ด๋ผ์ ์์ ์ ์์์ง๋ง, ๋ญ ๋ค๋ฅธ ๋ฌธ์ ๋ ์์ ์๋๊ฑด ์๋๋ผ ๊ทธ๋ฅ ์ด๊ฑฐ ํ์๋ค
๋ฐฅ ๋จน๊ณ ์ข ์ฌ์๋ค๊ฐ ๋ฌธ์ ๋ณด๊ธฐ ์์ํ๋๋ฐ ๋งํ๋ ๋ถ๋ถ์ด ์๊ฒผ๋ค
๊ทธ๋์ ์ ๊ธฐํ ๊น ๋ค๋ฅธ ๋ฌธ์ ๋ ๋ณด๊ธด ํ์ง๋ง, ์ฐจ๋ผ๋ฆฌ ์ง๊ธ๊น์ง ๋ถ์์ด๋ผ๋ ํด๋์ ์ด๊ฑธ ๋์ ํ๋๊ฒ ๋ง๋ค๊ณ ์๊ฐํด์ ์๋ํ๋ค
์ ๋ ์ฏค ๋๋ PWN 1๋ฒ ํ์ด์๊ฐ ๋ง์์ก๊ณ , ๋ฌธ์ ๋ ์ฌ์ด ๋ฌธ์ ๋ผ๊ณ ํ๋จํ์ง๋ง, ์์ฃผ ๊ฑฐ๋งํ ์๊ฐ์ผ๋ก ํ์ด๋ 250์ ์ ์ฃผ๋
"๋๋ 1000์ ์ ํ์ด์ ๋ณธ์ ๊ฐ๊ฑฐ์ผ!๋ผ๋ ์์ฃผ์์ฃผ ๊ฑฐ๋งํ ์๊ฐ์ ๊ฐ์ง๊ณ ๋ถ๋ช ํ ์๋ํ์ผ๋ฉด ํ์์ ์๋ ์์๊ฒ ์ง๋ง ์ํ๊ณ ์ด ๋ฌธ์ ๋ง ์ก์๋ค
์คํ 9์๋ถํฐ๋ ๊ทธ๋ฅ ๋ชจ์๋๋ฉด ๋ ๋ง์ธ๋๋ก ์ด ๋ฌธ์ ๋ง ํ ์ง๋ง, ๊ฒฐ๊ตญ ์คํจํ๋ค
๊ธฐ์์ฌ์ ๋ฐ๋ฐ์ ํด์ ์ข ํด๋ดค๋๋ฐ ์์ ๊น์ง ๋ชปํ์๊ณ , ์ด๊ฑฐ ๋ชปํ๋ฉด ๋ชป์๊ฒ ๋ค ์ถ์ด์ 2์๊ฐ์ ๋ ๋ ๋ณด๋๊น ๊ฒฐ๊ตญ์๋ ํ๋ ธ๋ค,,,,,
์๋ฒ๊ฐ ๋ซํ์ ๋ก์ปฌ์์ ๋์ปค ํ๊ฒฝ ๊ตฌ์ถํด์ ์ ์ํด์ ํ์๋ค


๋ฌธ์ ๋ฅผ ๋ดค์๋ ๋ญ ์ํธํ? ๊ทธ๋ฐ๊ฑธ ์ฃผ๊ณ ์ธ์ฆ์ ํ๋ผ๋๊ฒ ์์๋๋ฐ ๊ทธ๊ฑด ๊ทธ๋ฅ gpt ๋๋ ค์ ๊ทธ๋ฅ ํ์๋ค
๋ํ๋๋ ์ ๋์ ์ด๋ฏธ์ง ์์ฑ์ ํ์ฉํด์ ๋ฌธ์ ๋ฅผ ํธ๋ ค๊ณ ํ์ง๋ง ์ ์๋์๋ค
๋ํ ๋๋๊ณ ํ์ฐธ๋ค์ ๋ฌธ์ ํ์ผ ๋์ปค ๋น๋ํ๊ณ ๋ฌธ์ ํ์ด๋ดค๋๋ฐ ์ ํ๋ ธ๋ค
์ ๋ง ํ๋ฌดํ๊ฒ๋ ์ฒ์๋ถํฐ ๋ค์, ์ด๋ค ๋ฐฉํฅ์ผ๋ก ํ์ด์ผํ ์ง ์๊ณ ํธ๋๊น ์๋ฒ ๊ตฌ์ถ ์๋ฃ์ ๋์์ ํ 40๋ถ์ ๋๋ง์ ํ๋ ธ๋ค
์์ผ๋ก๋ ์๋งํ์ง ๋ง๊ณ ํ ์ ์๋๊ฑด ๊ผญ ํ์ด์ผ๊ฒ ๋ค
'CTF' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ 2025 COSS ์์ฃผ๋ CTF - ๋ณธ์ ] - Write Up & ํ๊ธฐ (5) | 2025.07.25 |
|---|---|
| [2025 COSS ์์ฃผ๋ CTF - ์์ ] - Write Up & ํ๊ธฐ (0) | 2025.06.23 |
| [2025 DIMI CTF Write Up] - Prob by pandas. with ํ๊ธฐ (3) | 2025.03.25 |
| [CTF] ์ 5ํ ์ค๋ถ๋ํ๊ต JBU CTF (1) | 2025.02.27 |
| [CTF] 2024 ELECCON ์ผ๋ ์ฝ ์์ (0) | 2025.02.27 |