๋ ๋ํ ยท AI ์๋ํ ยท ์์คํ
์์ง๋์ด๋ง
์ง์ ๋ง๋ค๊ณ , ์คํํ๊ณ , ๊ธฐ๋กํ๋ค
ยฉ 2026 ZINO LAB
[๐ฅ Bronze 1] ๊ฒ์ฆ์์ ๋ธ๋ผ์ฐ์ ๋์ ๋ด๊ฐ ๊ณ์ฐํ๊ธฐ โ DreamHack funjs ํ์ด โ ZINO
2026-07-06 ยท 1๋ถ ์ฝ๊ธฐ ยท
input ๊ฐ์ ๊ฒ์ฌํ๋ JS๊ฐ ๋๋
ํ๋ผ ์์ง๋ง, ์ค์ ๋ก ๊ฐ๋ ค์ง ๊ฑด charCodeAtยทlength ๊ฐ์ ๋ฉ์๋ ์ด๋ฆ๋ฟ์ด๋ค. ์ ๋ต์ ๋ง๋๋ ๋ ์ซ์ ๋ฐฐ์ด๊ณผ ์ฌ์น์ฐ์ฐ ์ฌ์ดํด์ ํ๋ฌธ ๊ทธ๋๋ก ๋ฐฐ๋ฌ๋๋ฏ๋ก, ๋ธ๋ผ์ฐ์ ๊ฐ ํ ๊ณ์ฐ์ ํ์ด์ฌ์ผ๋ก ๊ทธ๋๋ก ์ฎ๊ฒจ ์คํํ๋ฉด ๊ทธ๊ฒ ๊ณง ํ๋๊ทธ๋ค.
๋ฌธ์ : DreamHack โ funjs
๋ถ๋ฅ : Web
๋์ด๋ : ๐ฅ Bronze 1
FLAG : DH{cfd4a77a013ea616d3d5cc0ddf87c1ea}
funjs ๋ฌธ์ ํ์ด์ง โ DreamHack CTF Season 1 Round #4 ์ถ์
์ ๊ณต ํ์ผ์ index.html ํ๋. ์๋ฒ๋, API๋ ์๋ค. "main ํจ์๋ฅผ ๋ถ์ํด์ ์ฌ๋ฐ๋ฅธ ์
๋ ฅ ๊ฐ์ ์ฐพ์ผ๋ผ"๋ ์ค๋ช
์ด ์ ๋ถ๋ค. ์ด์ด๋ณด๋ฉด ๋ต๋ถํฐ ๋์จ๋ค โ ๋๋
ํ๋ ๊ฑด ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ๊ฒํฌ์ฅ๋ฟ์ด๊ณ , ์ ๋ต์ ๋ง๋๋ ์ซ์๋ค์ ์ฒ์๋ถํฐ ํ๋ฌธ์ผ๋ก ๋ฐฐ๋ฌ๋ผ ์์๋ค.
๐งฉ ๋ฐฐ๊ฒฝ โ ์ด ๋๋
ํ๊ฐ ์ค์ ๋ก ๊ฐ๋ฆฌ๋ ๊ฒ
๋ค์ด๋ก๋ํ index.html ์์๋ <script> ํ๊ทธ ํ๋๋ฟ์ด๋ค. ์ด์ด๋ณด๋ฉด ๋ฏ์ต์ ํจํด์ด ๋ณด์ธ๋ค.
var _0x1046 = [ '2XStRDS' , '1388249ruyIdZ' , 'length' , '23461saqTxt' , ...];
var _0x376c = function ( _0xed94a5 , _0xba8f0f ) {
์ด ๊ธ์ด ๋์์ด ๋๋์?
๐ฅ ํต์ฌ ๐ก ์ธ์ฌ์ดํธ ๐ ์ข์์ ๐คฏ ์ถฉ๊ฒฉ โก ๋น ๋ฆ
_0xed94a5 = _0xed94a5 - 0x175 ;
var _0x1046bc = _0x1046 [ _0xed94a5 ];
return _0x1046bc ;
};
๋ฌธ์์ด์ ๋ฐฐ์ด ํ๋์ ๋ชฐ์๋ฃ๊ณ , IIFE๋ก ๋ฐฐ์ด ์์๋ฅผ ํ ๋ฒ ์์ ๋ค์, ์ธ๋ฑ์ค ๊ณ์ฐ์ผ๋ก ์๋ ๋ฌธ์์ด์ ๋์ฐพ์ ์ฐ๋ ์ ํ์ ์ธ javascript-obfuscator ์คํ์ผ ๋ฌธ์์ด ํ
์ด๋ธ์ด๋ค. _0x374fd6(0x183) ๊ฐ์ ํธ์ถ์ด ์ค์ ๋ก๋ getElementById ๊ฐ์ ํํ ๋ฉ์๋ ์ด๋ฆ์ด๋ผ๋ ๋ป.
์ค์ํ ๊ฑด ์ด ๊ธฐ๋ฒ์ด ๊ฐ๋ฆด ์ ์๋ ๋์ ์ด๋ค. ๋ฌธ์์ด ํ
์ด๋ธ์ "charCodeAt" , "length" , "getElementById" ์ฒ๋ผ ์์ค์ ์๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด๋ก ๋ฐํ ์๋ ๊ฒ๋ง ๊ฐ์ถ ์ ์๋ค. ๋ฐ๋ฉด ๊ฒ์ฆ์ ์ฐ์ด๋ ์ซ์ ๋ฐฐ์ด๊ณผ ์ฐ์ฐ์ ๋ ์ ์ด์ ๋ฌธ์์ด์ด ์๋๋ผ ์ฐ์ ๋ฆฌํฐ๋ด์ด๋ผ ์ด ํ
์ด๋ธ์ ๊ฑฐ์น์ง ์๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์คํ ์์ ์ ์ค์ ๊ฐ์ ์์์ผ ๊ณ์ฐ์ด ๋๊ธฐ ๋๋ฌธ์, ๊ตฌ์กฐ์ ์ผ๋ก ํ๋ฌธ ๋ฆฌํฐ๋ด๋ก ๋จ์ ์๋ฐ์ ์๋ค. ์ฆ ๊ฒ๋ชจ์ต๋ง ์ด๋ ค์ ๋ณด์ผ ๋ฟ, ์ ๋ต์ ๋ง๋๋ ์ฌ๋ฃ๋ ์ฒ์๋ถํฐ ๋ค ๊ณต๊ฐ๋ผ ์๋ค.
๐ฌ ์ ์ฐฐ
ํ๋ฉด โ ์์ง์ด๋ ๋ฐ์ค์ debugger; ๋ก์ปฌ๋ก ํ์ผ์ ๋์ฐ๋ฉด ์
๋ ฅ์ฐฝ๊ณผ ๋ฒํผ๋ฟ์ธ ํ์ด์ง๊ฐ ๋ฌ๋ค.
๋ก์ปฌ ์๋น โ Find FLAG! ์
๋ ฅ ํผ
function moveBox () {
box . posX = Math . random () * ( window . innerWidth - 64 );
box . posY = Math . random () * ( document . documentElement . scrollHeight - 64 );
box . style . marginLeft = box . posX + "px" ;
box . style . marginTop = box . posY + "px" ;
debugger ;
}
setInterval ( moveBox , 1000 ); #formbox (์
๋ ฅ์ฐฝ + ๋ฒํผ์ ๋ด์ div)๋ฅผ 1์ด๋ง๋ค ํ๋ฉด ๋๋ค ์์น๋ก ์ฎ๊ธด๋ค. ๊ฒ๋ค๊ฐ ๋งค ํฑ๋ง๋ค debugger; . DevTools๋ฅผ ์ด์ด๋๊ณ ๋ถ์ํ๋ ์ฌ๋์ 1์ด๋ง๋ค ๋ฉ์ถฐ ์ธ์ฐ๋ ค๋ ์๋ฏธ์ด ํผ๋ฐฉ์ด๋ค. ํ์ง๋ง DevTools๋ฅผ ์ ์ด๋ฉด debugger; ๋ ๊ทธ๋ฅ ์๋ฌด ์ผ๋ ์ ํ๋ ๋ฌธ์ฅ์ด๊ณ , ๊ฒ์ฆ ๋ก์ง์ ๋ฒํผ ํด๋ฆญ ์ ๋๊ธฐ์ ์ผ๋ก ํ ๋ฒ์ ๋๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ค๊ฐ ์ด๋๋ก ์์ง์ด๋ ๊ฒฐ๊ณผ์๋ ์ ํ ์ํฅ์ด ์๋ค. ์ํ์ ์ผ๋ก ๋ณด์ด์ง๋ง ์ค์ง์ ์ผ๋ก๋ ์ฅ์์ด๋ค.
main() โ ์ง์ง ๊ฒ์ฆ ๋ก์ง๋ฌธ์์ด ํ
์ด๋ธ์ ๊ฑท์ด๋ด๊ณ ๋๋ฉด main() ์ ๋ผ๋๋ ์ด๊ฑฐ๋ค.
var flag = document . getElementById ( "flag" ). value ,
_0x4949 = [ 0x20 , 0x5e , 0x7b , 0xd2 , 0x59 , /* ... 36๊ฐ */ ],
_0x42931 = [ 0x24 , 0x16 , 0x1 , 0xb1 , 0xd , /* ... 36๊ฐ */ ],
operator = [
( x , y ) => x + y ,
( x , y ) => x - y ,
( x , y ) => x * y ,
( x , y ) => x ^ y ,
];
if ( flag . length != 0x24 ) { text2img ( "NOP !" ); return ; } // 0x24 = 36์
for ( var i = 0 ; i < flag . length ; i ++ ) {
if ( flag . charCodeAt ( i ) == operator [ i % operator . length ]( _0x4949 [ i ], _0x42931 [ i ])) {
continue ;
}
text2img ( "NOP !" );
return ;
}
text2img ( flag ); // ์ฌ๊ธฐ๊น์ง ์์ผ๋ฉด ํต๊ณผ โ ์
๋ ฅ๊ฐ ์์ฒด๋ฅผ ๊ทธ๋๋ก ๊ทธ๋ ค์ค๋ค text2img ๋ ๊ฒฐ๊ณผ๋ฅผ DOM ํ
์คํธ๊ฐ ์๋๋ผ <canvas> ์ ๊ทธ๋ ค <img> ๋ก ๋ฐ์ ๋ฃ๋ ํจ์๋ค. Ctrl+F ๋ก ์ ๋ต ๋ฌธ์์ด์ ๊ฒ์ํด๋ ์ ๊ฑธ๋ฆฌ๊ฒ ํ๋ ค๋ ์๋๋ก ๋ณด์ด์ง๋ง, ๊ฒ์ฆ ์์ฒด๊ฐ ํด๋ผ์ด์ธํธ์์ ๋์๊ฐ๋ ์ด์ ์บ๋ฒ์ค๋ก ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ฆฌ๋ ๋ง๋ ๋ก์ง์ ์ฝ๋ ๋ฐ๋ ์๋ฌด ์ง์ฅ์ด ์๋ค.
ํต์ฌ ๋น๊ต๋ ๋ฑ ํ ์ค์ด๋ค.
flag.charCodeAt(i) == operator[i % 4](_0x4949[i], _0x42931[i]) _0x4949 , _0x42931 ์ 36๊ฐ์ง๋ฆฌ 16์ง์ ์์ ๋ฐฐ์ด, operator ๋ +, -, *, ^ ๋ค ๊ฐ๊ฐ i % 4 ๋ก ์ํํ๋ค. ์ ๋ถ ์์ค์ ๊ทธ๋๋ก ์ ํ ์๋ค. ์ฆ ์ ๋ต ๋ฌธ์ ์ฝ๋ ์์ฒด๊ฐ ์ด๋ฏธ ๊ณ์ฐ ๊ฐ๋ฅํ ํํ๋ก ๊ณต๊ฐ๋ผ ์๋ค โ ๋ธ๋ฃจํธํฌ์ค๋, ๋ฐฉ์ ์์ ๋ค์ง์ ํ์๋ ์๋ค. ์ ์์ ๊ทธ๋๋ก ์คํ๋ง ํ๋ฉด ๋๋ค.
โถ ์ผ๋จ ์๋ฌด ๊ฐ์ด๋ ๋ฃ์ด๋ณธ ์ฝ์ง๋ก์ง์ ์ฝ๊ธฐ ์ ์ ๋๋ ์ ๋๋ ์๋ฌด ๋ฌธ์์ด์ด๋ ๋จผ์ ๋ฃ์ด๋ดค๋ค.
์ค๋ต โ ์บ๋ฒ์ค์ NOP ! ๋ ๋
length != 36 ์ด๊ฑฐ๋ ๋ฌธ์ ์ฝ๋๊ฐ ํ๋๋ผ๋ ์ ๋ง์ผ๋ฉด ๋ฌด์กฐ๊ฑด NOP ! . ์ฌ๊ธฐ์ ๋๋์๊ฐ main() ์์ค๋ฅผ ์ ๋๋ก ์ฝ์๋ค.
๐ฃ ํต์ฌ โ ๋๋
ํ๋ ๊ฑด ์ด๋ฆํ๋ฟ, ๊ฐ์ ์ฒ์๋ถํฐ ํ๋ฌธ ์ ๋ฆฌํ๋ฉด ์ด ๋ฌธ์ ์ ๊ตฌ์กฐ๋ ์ด๋ ๋ค.
๊ฐ๋ ค์ง ๊ฒ ์ ๊ฐ๋ ค์ง ๊ฒ ๋ฉ์๋/ํ๋กํผํฐ ์ด๋ฆ (charCodeAt , length , getElementById ๋ฑ) โ ๋ฌธ์์ด ํ
์ด๋ธ + ์ธ๋ฑ์ค ์ํํธ ์ ๋ต์ ๋ง๋๋ ์ซ์ ์์ ๋ ๋ฐฐ์ด ๊ณผ ์ฐ์ฐ์ ์ํ โ ์ฐ์ ๋ฆฌํฐ๋ด์ด๋ผ ๋ฌธ์์ด ํ
์ด๋ธ์ ์ ๊ฑฐ์นจ
javascript-obfuscator ๋ฅ ๋๊ตฌ๋ ์๋ณ์ยท๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ผ๋ง๋ ์ง ๊ฐ๋ฆด ์ ์์ด๋, ์คํ ์์ ์ ์ค์ ๊ณ์ฐ์ด ์ด๋ค์ ธ์ผ ํ๋ ์ฐ์ ๋ฐ์ดํฐ๊น์ง ๊ฐ์ถ ์๋ ์๋ค(๊ฐ์ถ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๊ณ์ฐ์ ๋ชป ํ๋ค). ๊ทธ๋์ "๋๋
ํ๋๋ค"๋ ์ธ์๊ณผ ๋ณ๊ฐ๋ก, ๊ฒ์ฆ ๊ณต์ + ์์ = ์ ๋ต ์ธ ๋ฌธ์ ๋ ์ฝ๋๋ฅผ ํ ๋ฒ ์ฝ๋ ๊ฒ๋ง์ผ๋ก ๋ค ๋ซ๋ฆฐ๋ค. ์๋ฒ ์๋ณต๋, ๋ฐ๋ณต ์๋๋ ํ์ ์๋ค.
๐ฏ ์ต์คํ๋ก์ โ ๊ฒ์ฆ์์ ํ์ด์ฌ์ผ๋ก ๊ทธ๋๋ก ์ฎ๊ธฐ๊ธฐ _0x4949 , _0x42931 ๋ ๋ฐฐ์ด์ ์ ๊ท์์ผ๋ก ๋ฝ์ charCodeAt ๋น๊ต์ ๊ทธ๋๋ก ์ฌํํ๋ค.
import re
src = open ( "extracted/script_extracted.js" ). read ()
a = [ int (x, 16 ) for x in re. search ( r "_0x4949\s * =\s * \[ ([ ^ \] ]+) \] " , src). group ( 1 ). split ( "," )]
b = [ int (x, 16 ) for x in re. search ( r "_0x42931\s * =\s * \[ ([ ^ \] ]+) \] " , src). group ( 1 ). split ( "," )]
ops = [ lambda x , y : x + y, lambda x , y : x - y, lambda x , y : x * y, lambda x , y : x ^ y]
flag = "" . join ( chr (ops[i % 4 ](a[i], b[i])) for i in range ( len (a)))
print (flag) solve.py ์์ค + ์คํ ๊ฒฐ๊ณผ โ ํ๋๊ทธ๊ฐ ๋ฐ๋ก ์ถ๋ ฅ๋๋ค
DH{cfd4a77a013ea616d3d5cc0ddf87c1ea} ๋ด ๊ณ์ฐ์ด challenge์ ์ค์ ๊ฒ์ฆ ๋ก์ง๊ณผ ์ ํํ ์ผ์นํ๋์ง๋ ์ถ์ธก์ผ๋ก ๋จ๊ฒจ๋์ง ์์๋ค. ๋ค์ด๋ก๋ํ index.html ์ <script> ๋ฅผ ์๋ณธ ๊ทธ๋๋ก Node์ ๋ก๋ํ๊ณ , document.getElementById("flag") ๋ง ์ด ๊ฐ์ผ๋ก ์ฑ์ด mock DOM์ ๋ถ์ฌ์ main() ์ ์ง์ ์คํ์์ผ๋ดค๋ค โ ํ๋ฆฐ ๊ฐ์ ๋ฃ์ผ๋ฉด ์บ๋ฒ์ค์ NOP ! ๊ฐ, ์ด ๊ฐ์ ๋ฃ์ผ๋ฉด ์บ๋ฒ์ค์ ํ๋๊ทธ ๋ฌธ์์ด ๊ทธ๋๋ก๊ฐ ๊ทธ๋ ค์ก๋ค. ๋ธ๋ผ์ฐ์ ์์๋ ๋์ผํ๊ฒ ์ฌํ๋๋ค.
์ ๋ต โ ์บ๋ฒ์ค์ ํ๋๊ทธ ๋ฌธ์์ด์ด ๊ทธ๋๋ก ๋ ๋๋๋ค
DreamHack ๋ผ์ด๋ธ ํ์ด์ง์ ๊ฐ์ ๊ฐ์ ์ ์ถํ๋ฉด ํ์ธ๋๋ค.
DreamHack ์ ์ถ โ ์ถํํฉ๋๋ค! ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค
๐ ๊ฒฐ๋ก ํด๋ผ์ด์ธํธ์์ ๋๋ ๊ฒ์ฆ์, ๊ทธ ๊ฒ์ฆ ์ฝ๋ ์ ์ฒด๊ฐ ์ด๋ฏธ ๊ณต๊ฒฉ์ ์์ ์๋ค๋ ๋ป์ด๋ค.
์ด๋ฆ์ ์๋ฌด๋ฆฌ ๊ฐ๋ ค๋ ์คํ์ ํ์ํ ์ค์ ๊ฐ(์์ยท์ฐ์ฐ)์ ์์ค์ ๊ทธ๋๋ก ๋จ๋๋ค. ์ด๋ฒ ๋ฌธ์ ์ฒ๋ผ "์ ๋ต ๋ฌธ์ ์ฝ๋ = ์์ ๋ฐฐ์ด + ์ฐ์ฐ์"๋ผ๋ ์ ์์ฒด๊ฐ ๊ณต๊ฐ๋ผ ์์ผ๋ฉด, ๊ณต๊ฒฉ์๋ ๋ธ๋ฃจํธํฌ์ค๋์ปค๋
๊ทธ ์์ ๋ณต์ฌํด์ ์คํ๋ง ํ๋ฉด ๋๋ค. debugger; ๋๋ฐฐ๋ ๋ฐ์ค๋ฅผ ์์ง์ด๋ ์ฐ์ถ์ ๋ถ์์ ๊ท์ฐฎ๊ฒ ํ ๋ฟ ์ค์ ๋ฐฉ์ด๋ ฅ์ ์๋ค.
์ง์ง ๋น๋ฐ์ ์๋ฒ์ ๋จ๊ฒจ์ผ ํ๋ค. ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์๊ฐ ์์ ํ ํต์ ํ๋ ํ๊ฒฝ์ด๋ผ, ์ฌ๊ธฐ์ ๋๋ ์ด๋ค ๊ฒ์ฌ๋ ๊ฒฐ๊ตญ ์ฐํ ๊ฐ๋ฅํ ์ฐธ๊ณ ์๋ฃ์ผ ๋ฟ์ด๋ค. ์
๋ ฅ๊ฐ ๊ฒ์ฆ์ด๋ UX์ฉ ์ฆ์ ํผ๋๋ฐฑ ์ ๋๋ ํด๋ผ์ด์ธํธ์์ ํด๋ ๋์ง๋ง, ์ ๋ตยท๋ผ์ด์ ์ค ํคยท๊ถํ ํ์ ์ฒ๋ผ ์ง์ง ์ค์ํ ํ๋จ์ ๋ฐ๋์ ์๋ฒ ์๋ณต์ผ๋ก ํ์ธํด์ผ ํ๋ค.
+5
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ