์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
1. ๊ฐœ์š”2. ์›๋ฆฌ3. ์˜ˆ์‹œ
3.1. ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ์šฉ
4. ํ™œ์šฉ5. ์—ฌ๋‹ด


JSFuck
ํ™ˆํŽ˜์ด์ง€

1. ๊ฐœ์š”[ํŽธ์ง‘]

JavaScript + BrainFuck = JSFuck

๋‚œํ•ดํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ, ๋‚œํ•ดํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ. JavaScript ์ฝ”๋“œ๋ฅผ JavaScript ๋ฌธ๋ฒ•์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ž ์ค‘ ๋‹จ 6๊ฐ€์ง€์ธ [ ] ( ) ! +๋งŒ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ์— ์ฐฉ์•ˆํ•˜์—ฌ ๊ณ ์•ˆ๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์ด๋‹ค.

2. ์›๋ฆฌ[ํŽธ์ง‘]

์œ„ 6๊ฐ€์ง€ ๋ฌธ์ž ์ค‘ ๋‹จ๋…์œผ๋กœ ์จ์„œ ๋ฉ€์ฉกํ•œ ๊ฑด [] (์–ด๋ ˆ์ด ๋ฆฌํ„ฐ๋Ÿด) ๋ฟ์ธ๋ฐ, ์—ฌ๊ธฐ์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ์‹œ์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•ŒํŒŒ๋ฒณ ๋ฌธ์ž์—ด "a" ๋Š” ๋‹ค์Œ์˜ ๊ณผ์ •์— ์˜ํ•ด ์–ป์–ด์˜ค๊ฒŒ ๋œ๋‹ค.
  • ![] = false
    ๋ฐฐ์—ด ์ž์ฒด๋Š” truthyํ•œ ๊ฐ’์œผ๋กœ ์ธ์ •๋˜๋ฏ€๋กœ, ์—ฌ๊ธฐ์— ๋ถ€์ •์„ ์˜๋ฏธํ•˜๋Š” !(๋А๋‚Œํ‘œ)๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด false๊ฐ€ ๋‚˜์˜จ๋‹ค.
  • (๊ฐ์ฒด)+[] = ""
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์˜ค๋ธŒ์ ํŠธ ๊ฐ„์— +(๋”ํ•˜๊ธฐ) ์—ฐ์‚ฐ์€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ์˜ค๋ธŒ์ ํŠธ๋ผ๋ฆฌ ๋”ํ•˜๊ฒŒ ๋˜๋ฉด .toString()(๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜) ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด ๋ฌธ์ž์—ด ๊ฐ„์˜ ๋”ํ•˜๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. ์˜ค๋ธŒ์ ํŠธ๋กœ ์ทจ๊ธ‰๋˜๋Š” ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ [] + [] ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด [].toString() = ""์ด๋ฏ€๋กœ, ๊ฒฐ๊ณผ์ ์œผ๋กœ "" + "" = ""(๋นˆ ๋ฌธ์ž์—ด)์ด ์ƒ์„ฑ๋œ๋‹ค.
  • false + "" = "false"
    ๋ถ€์šธ ๊ฐ’์ธ false์— ๋นˆ ๋ฌธ์ž์—ด์„ ๋”ํ•˜๊ฒŒ ๋˜๋ฉด false.toString() = "false"์ด๋ฏ€๋กœ "false" ๋ผ๋Š” ๋ฌธ์ž์—ด์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. ์•ž์„œ ํ™•์ธํ•œ ๋‚ด์šฉ์„ ์กฐํ•ฉํ•ด๋ณด๋ฉด ![]+([]+[]) = false + "" = "false"๊ฐ€ ๋œ๋‹ค.
  • !![] = true
    false๋ฅผ ๋ถ€์ •ํ•˜๋ฉด true๊ฐ€ ๋œ๋‹ค.
  • +true = 1
    true ์•ž์— unary plus๋ฅผ ์“ฐ๋ฉด ์ˆซ์žํ˜• 1๋กœ ๋ณ€ํ™˜์ด ๋œ๋‹ค. # ์•ž์„œ ์–ป์–ด์˜จ !![] = true์˜ ์•ž์— + ๋ฅผ ๋„ฃ์€ +!![] ๋Š” ์ˆซ์ž 1์ด ๋œ๋‹ค.
  • "false"[1] = "a"
    ์•ž์„œ ์–ป์–ด์˜จ ๋ฌธ์ž์—ด "false"์˜ ๋‘ ๋ฒˆ์งธ ์•ŒํŒŒ๋ฒณ์ด a์ด๋ฏ€๋กœ "false"[1]์€ "a"๊ฐ€ ๋œ๋‹ค. 0๋ถ€ํ„ฐ ์„ธ๋Š” ๊ฒƒ์— ์ฃผ์˜.
  • ์ง€๊ธˆ๊นŒ์ง€ ํŒŒ์•…ํ•œ ๋‚ด์šฉ๋“ค์„ ๋ชจ๋‘ ์ด์œผ๋ฉด (![]+[])[+!![]] = (false + "")[+true] = "false"[1] = "a" ๊ฐ€ ๋œ๋‹ค. ํ•ด๋ƒˆ๋‹ค!!

์ด๋Ÿฐ ์‹์œผ๋กœ ์•ŒํŒŒ๋ฒณ/์ˆซ์ž๋ฅผ ์–ป์–ด์˜ค๊ณ , ๊ฐ์ข… ๋‚ด์žฅ ์˜ค๋ธŒ์ ํŠธ ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ๊ฐ์ฒด ๋“ฑ์— ์ ‘๊ทผํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ๋˜ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ, ์ตœ์ข…์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์‹ค์ œ๋กœ ์œ„ ํ™ˆํŽ˜์ด์ง€์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์œ„์˜ 6๊ธ€์ž๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์น˜ํ™˜ํ•ด์„œ JSFuck ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ๊ฐ„ํ˜น ์œ„์˜ ๋ฐฉ๋ฒ•๋งŒ์œผ๋กœ๋Š” ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ž๊ฐ€ ๋“ฑ์žฅํ–ˆ์„ ๊ฒฝ์šฐ ๋ฌธ์ž ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์–ด๋–ป๊ฒŒ๋“  ํšŒํ”ผํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

3. ์˜ˆ์‹œ[ํŽธ์ง‘]

๋‹ค์Œ์€ JSFuck ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑ๋œ alert(1) ํ˜ธ์ถœ ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ์•„๋ž˜ ํ…์ŠคํŠธ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์ฝ˜์†”[1] ๋“ฑ์— ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•˜๋ฉด alert ์ฐฝ์œผ๋กœ 1์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ ๋งจ ๋’ค์˜ ()๋ฅผ ์ƒ๋žตํ•˜๊ณ  ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์ฝ˜์†”์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[
]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]
])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+
(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+
!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![
]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]
+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[
+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!!
[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![
]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[
]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![
]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(!
[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])
[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(
!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[
])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()


๋ฌด๋ ค 1,227๊ธ€์ž์— ๋‹ฌํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ์ฝ”๋“œ...์ธ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์‚ฌ์‹ค ์ž˜ ๋œฏ์–ด๋ณด๋ฉด []["filter"]["constructor"]("alert(1)")()๋กœ ์ค„์–ด๋“œ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ , ์ด๋Š” [].filter.constructor("alert(1)")() = Function("alert(1)")()์œผ๋กœ ํ•ด์„๋˜์–ด ์ตœ์ข…์ ์œผ๋กœ๋Š” alert(1)์ด ์‹คํ–‰๋œ๋‹ค. 1227๊ธ€์ž ์ค‘์— ๋ฌด๋ ค 1186๊ธ€์ž๋ฅผ ๋ฌธ์ž์—ด ๋งŒ๋“œ๋Š” ๋ฐ ์ผ๋‹ค ECMA2015(ES6)๋ถ€ํ„ฐ๋Š” filter ๋Œ€์‹  fill์„ ์จ๋„ ๋œ๋‹ค.


๋˜ ๋‹ค๋ฅธ ์˜ˆ์ œ

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž.
  • 0.1 + 0.2 = 0.30000000000000004
    number์— number๋ฅผ ๋”ํ•˜๋ฉด ๋‹น์—ฐํžˆ number์ด๋‹ค. 0.3 ๋’ค์— 0์ด ๊ณ„์† ๋”ฐ๋ผ๋ถ™๋Š” ๊ฒƒ์€ ๋ถ€๋™์†Œ์ˆ˜์ ์˜ ํ•œ๊ณ„ ๋•Œ๋ฌธ์ด๋‹ค.
  • +null = 0
    null ์•ž์— unary plus๋ฅผ ์“ฐ๋ฉด 0์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.
  • [] + [] = ""
    ๋นˆ ๋ฐฐ์—ด๋ผ๋ฆฌ๋Š” ๋ฐ”๋กœ ๋”ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— .toString() ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์—ฌ "" + "" = ""์ด ๋œ๋‹ค.
  • [][[]] = undefined
  • +(![]+[]) = NaN
  • [] + {} = "[object Object]"
    ์œ„์™€ ๊ฐ™์ด ๋นˆ ์˜ค๋ธŒ์ ํŠธ์— .toString() ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค.
  • ++[[]][+[]]+[+[]] = "10" (???)

++[[]][+[]]+[+[]]๋Š” ์˜๋„์ ์œผ๋กœ ์‚ฌ๋žŒ ํ–‡๊ฐˆ๋ฆฌ๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ์ž‘์„ฑ๋œ ์ฝ”๋“œ์ด๊ธด ํ•˜๋‚˜, ๋ถ„์„ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ฃผ์„์œผ๋กœ ๊ด€๋ จ ๋งํฌ๋ฅผ ๋‹ฌ์•„๋†“์•˜์œผ๋‹ˆ ์ •๋ง ๊ทธ ๋‚ด๋ถ€๊นŒ์ง€ ๊ถ๊ธˆํ•œ ์‚ฌ๋žŒ๋“ค์€ ๋”ฐ๋ผ๊ฐ€๋ณด๊ธธ ๋ฐ”๋ž€๋‹ค.
  • ์—ฐ์‚ฐ์ž ++๋Š” + ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์œผ๋ฏ€๋กœ[2] ํ‘œ๋ฉด์ ์œผ๋กœ ๋ฐ–์— ์œ„์น˜ํ•œ ++ ์™€ + ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ++[[]][+[]] , +, [+[]]์˜ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ์ดํ•ดํ•œ๋‹ค.
  • +[]์—์„œ์˜ +๋Š” unary operator๋กœ, +[]๋Š” +[].toString()[3]๊ณผ ๋™์น˜๊ฐ€ ๋˜์–ด +""๊ฐ€ ๋˜๊ณ , ๋นˆ ๋ฌธ์ž์—ด "" ์— ๋Œ€ํ•œ unary plus ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋Š” 0[4]์ด๋‹ค. ?
  • ์œ„์˜ ๋ถ„์„๋Œ€๋กœ +[]๋Š” 0์ด๋ฏ€๋กœ ์›๋ž˜์˜ ํ‘œํ˜„์€ ++[[]][0], +, [0]์˜ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ++[[]][0]์—์„œ ++ ๋’ค์˜ [[]][0]๋Š” ๋นˆ ๋ฐฐ์—ด 1๊ฐœ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ผ๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ ๊ทธ ์•ˆ์˜ ๋ฐฐ์—ด []์™€ ๋™์น˜...์ผ ์ˆ˜๋„ ์žˆ์œผ๋‚˜ ๊ทธ๋ ‡๋‹ค๊ณ  ๋ฏธ๋ฆฌ ์ค„์—ฌ์„œ ++[]๋กœ ์“ฐ๋ฉด ReferenceError๊ฐ€ ๋œฌ๋‹ค. ์ด๋Š” ++ ์—ฐ์‚ฐ์ž๊ฐ€ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๋Š”๋ฐ, [] ๋‹จ๋…์œผ๋กœ๋Š” ์–ด๋А ๋ณ€์ˆ˜์—๋„ ๋ฐ”์ธ๋”ฉ์ด ๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ์ด๊ณ  ๋”ฐ๋ผ์„œ ++[]๋Š” ๋งํ•˜์ž๋ฉด ๊ฐˆ ๊ณณ ์žƒ์€ ๋ช…๋ น์–ด ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.[5] ๋”ฐ๋ผ์„œ ++[[]][0]๋ฅผ ++[] ๋กœ ์ดํ•ดํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ??
  • ๋‹ค์‹œ ๋Œ์•„์™€์„œ, ++์˜ ๋Œ€์ƒ์ด [[]][0]๋ผ๋ฉด ์ด๋Š” ๋ฐฐ์—ด ์•ˆ์— ์žˆ๋Š” ๋ฐฐ์—ด[6]์— ++, ์ฆ‰ +1์„ ์‹œํ‚ค๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ๋˜๋ฉฐ, [] + 1์€ ๋ฌธ์ž์—ด "1"[7]์ด ๋˜๊ณ , ์ตœ์ข…์ ์œผ๋กœ ++[[]][0]๋Š” ๋ฐฐ์—ด ์•ˆ์˜ ๋ฐฐ์—ด []์— 1์„ ๋”ํ•˜๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ ๋’ค์— ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์ธ ์ˆซ์ž 1์„ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋œ๋‹ค.[8] ???
  • ํ‘œํ˜„์€ 1 + [0]์œผ๋กœ ๋‹จ์ˆœํ•ด์กŒ๋‹ค. ๋‹ค๋ฅธ ํƒ€์ž… ๊ฐ„์˜ ๋”ํ•˜๊ธฐ๋Š” toString()์„ ํ•œ ๊ฒฐ๊ณผ๋ฌผ์˜ ํ•ฉ์ด๋ฏ€๋กœ[9] "1" + "0"๋Š” "10"์ด ๋œ๋‹ค.

๊ทธ๋ƒฅ ์ €๋Ÿฐ๊ฑฐ ํ•„์š” ์—†์ด "10"์„ ๋งŒ๋“ค ๋• +!![]+(+[]+[])๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. +!![]๊ฐ€ Number ํ˜•์˜ 1์ด๊ณ  ๊ด„ํ˜ธ ์•ˆ์˜ +[]+[]๋Š” String ํ˜•์˜ "0"์ด ๋˜๊ณ  ๋ฌธ์ž์—ด๊ณผ ์ˆซ์ž์˜ ๊ฒฐํ•ฉ์€ ๋ฌธ์ž์—ด์ด ๋˜๋ฏ€๋กœ 1+"0"์€ ๊ฒฐ๊ณผ์ ์œผ๋กœ Stringํ˜•์˜ "10"์ด ๋œ๋‹ค. [+!![]]+[+[]]๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. []+[] = ""์„ ์ƒ๊ฐํ•ด ๋ณด์•„๋ผ. ์ ‘๊ทผ๋ฐฉ๋ฒ•์ด ๋ฌด๊ถ๋ฌด์ง„(?)ํ•˜๋‹ค

3.1. ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ์šฉ[ํŽธ์ง‘]

IE์—์„œ๋Š” ๋ฌธ์ž์—ด ์ถ”์ถœ ํŒŒํŠธ์—์„œ ์–ด๊ธ‹๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.๋ถ€๋ถ„์ ์œผ๋กœ ์‹คํ–‰ํ•ด๋ณด๋ฉด 'constructor', 'alert(1)'์ด ๋˜์–ด์•ผ ํ•  ๊ฒƒ์ด 'ninstruntir', 'alertr1('์™€ ๊ฐ™์ด ๋‚˜ํƒ€๋‚œ๋‹ค. ์ด๋Š” ์œ„์˜ JSFuck ๋ณ€ํ™˜๊ธฐ์—์„œ c, o ๋“ฑ์˜ ๋ฌธ์ž์—ด์„ []['filter']+[] = [].filter.toString()์—์„œ ์ถ”์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ[10], ์ด ๊ฒฐ๊ณผ๊ฐ€ ํŒŒ์ด์–ดํญ์Šค ๋“ฑ ํƒ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š”
"function filter() {
    [native code]
}"

์ธ ๋ฐ ๋ฐ˜ํ•ด, IE์—์„œ๋Š”
"
function filter() {
    [native code]
}
"

๋กœ ์ถœ๋ ฅ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ž˜ ๋ณด๋ฉด ์•ž๋’ค์— ๊ฐœํ–‰ ๋ฌธ์ž๊ฐ€ ๋ถ™์–ด ์žˆ์–ด ๊ธ€์ž๊ฐ€ ํ•˜๋‚˜์”ฉ ๋ฐ€๋ฆฌ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์—ฃ์ง€์—์„œ๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค.

์ด๋ก ์ ์œผ๋กœ๋Š” []['filter']+[]๊ฐ€ ๋“ฑ์žฅํ•˜๋Š” ๋ถ€๋ถ„์„ ([]['filter']+[])['trim']() = [].filter.toString().trim()์œผ๋กœ ๊ณ ์ณ์„œ ํŒŒ์ด์–ดํญ์Šค์™€ ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋Š” ์žˆ์œผ๋‚˜, JSFuck์—์„œ 'm'์„ ๋งŒ๋“ค๋ ค๋ฉด Number.toString()์„ ๊ฑฐ์ณ์•ผ ํ•˜๊ณ , ์ด๋•Œ ์œ„์˜ ๋ฌธ์ œ๊ฐ€ ๋˜ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ด๋Š” (0)["constructor"].toString() ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[
]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]
])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+
(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[
]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]
+(!![]+[])[+!+[]]])[[+!+[]]+[+!+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+
[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]
+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+
!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]
+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![
]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[[+!+[]]+[+!+[]]]+(!![]+[])[+!+[]]]((
![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]
+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+
[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[[!+[]+!+
[]]+[+!+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+
[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[[!
+[]+!+[]]+[+!+[]]])()

1,253์ž๋กœ ๋” ๋Š˜์–ด๋‚œ ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ, ๋ฌธ์ž์—ด์„ ์ถ”์ถœํ•˜๋Š” ์ˆซ์ž์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ ๊ณ ์ณค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

4. ํ™œ์šฉ[ํŽธ์ง‘]

XSS ๊ณต๊ฒฉ ๋ฒกํ„ฐ๋กœ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์ž…๋ ฅ๊ฐ’์ด ํ•„ํ„ฐ๋ง ๋˜๋Š” ๊ฒฝ์šฐ, ํŠนํžˆ ์•ŒํŒŒ๋ฒณ ์ž์ฒด๊ฐ€ ํ•„ํ„ฐ๋ง ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํŠน์ˆ˜ ๋ฌธ์ž๋งŒ์„ ์ด์šฉํ•ด์„œ XSS ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์•ž์—์„œ๋„ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์˜ค์ง ํŠน์ˆ˜ ๋ฌธ์ž๋งŒ์„ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ์— ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ JSFuck ์ž์ฒด๋ฅผ ์ด์šฉํ•ด ๊ณต๊ฒฉํ•˜๊ธฐ์—๋Š” ๋‹ค์†Œ ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๋Š”๋ฐ ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ํŠน์ˆ˜ ๋ฌธ์ž๋“ค[11]์„ ์ด์šฉํ•ด ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๊ณต๊ฒฉํ•˜๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค. JSFuck ์ž์ฒด๋ฅผ ์ด์šฉํ•œ๋‹ค๊ธฐ๋ณด๋‹ค๋Š” ์ด๋Ÿฌํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์„ฑ์งˆ๋“ค์„ ์ด์šฉํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

์›Œ๊ฒŒ์ž„์ด๋‚˜ CTF์—์„œ ๊ฐ„ํ˜น ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ์ด์šฉํ•œ XSS ๊ณต๊ฒฉ ๋ฌธ์ œ๊ฐ€ ์ถœ์ œ๋˜๊ณ ๋Š” ํ•œ๋‹ค.

5. ์—ฌ๋‹ด[ํŽธ์ง‘]

์•„๋ž˜์˜ ํ‘œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ”๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ํŠน์ˆ˜๋ฌธ์ž[12], ํŠนํžˆ ํ•œ๊ธ€์— ๋Œ€ํ•ด์„œ ์ทจ์•ฝํ•˜๋‹ค.

JSFuck์ด 6๊ฐ€์ง€ ๋ฌธ์ž๋กœ๋งŒ ํ‘œํ˜„๋˜๋Š” ๊ฒƒ์— ์ฐฉ์•ˆํ•ด ์ฝ”๋“œ ํ•œ ๊ธ€์ž๋‹น ๋น„ํŠธ์˜ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•œ๋‹ค๊ณ  ์น˜๊ณ  (UTF-8 ๊ธฐ์ค€์œผ๋กœ) ์›๋ฌธ๊ณผ JSFuck ์น˜ํ™˜ ๊ฒฐ๊ณผ์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์œ„ ํ™ˆํŽ˜์ด์ง€์—์„œ ์›ํ•˜๋Š” ๋ฌธ์žฅ์„ ์น˜๊ณ  Eval Source(์ฝ”๋“œ๋กœ ์ทจ๊ธ‰) ์ฒดํฌ๋ฅผ ํ•ด์ œํ•˜๋ฉด ์‹ค์ œ๋กœ ๋ช‡ ๊ธ€์ž๋กœ ์น˜ํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
์›๋ฌธ
(๋ฐ”์ดํŠธ ์ˆ˜)
JSFuck ๊ธ€์ž ์ˆ˜
(๋ฐ”์ดํŠธ ์ˆ˜)
์›๋ฌธ ๋Œ€๋น„ ์šฉ๋Ÿ‰
104,711๊ธ€์ž
(์•ฝ 33.04KB)
์•ฝ 75.86๋ฐฐ
116,477๊ธ€์ž
(์•ฝ 36.75KB)
์•ฝ 1017.19๋ฐฐ
๋‚˜๋ฌด์œ„ํ‚ค, ์—ฌ๋Ÿฌ๋ถ„์ด ๊ฐ€๊พธ์–ด ๋‚˜๊ฐ€๋Š” ์ง€์‹์˜ ๋‚˜๋ฌด.
(64๋ฐ”์ดํŠธ)
201,606๊ธ€์ž
(์•ฝ 63.62KB)
์•ฝ 1017.86๋ฐฐ
K
(1๋ฐ”์ดํŠธ)
5,609๊ธ€์ž
(์•ฝ 8.12KB)
5609๋ฐฐ

๋˜ํ•œ ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค๋กœ 63์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ๋Š” 48์ž[13]๊ฐ€ ํ•„์š”ํ•˜๊ณ , 48์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ์—๋Š” 63์ž[14]๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ด๋ฆ„์ด ์™ ์ง€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ ์ข†๊นŒ(...)๋ฅผ ์‹œ์ „ํ•˜๊ธฐ ์œ„ํ•œ ๋“ฏ ํ•˜๋‹ค.


[1] ์•„๋‹ˆ๋ฉด ์ฃผ์†Œ์ฐฝ์— javascript:๋ผ๊ณ  ์น˜๊ณ  ๊ทธ ๋’ค์— ๋ถ™์—ฌ๋„ฃ๊ณ  ์—”ํ„ฐ ์ณ๋„ ๋œ๋‹ค.
[4] ๋นˆ ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ToNumber() ๊ฒฐ๊ณผ๋Š” 0์ด๋ฉฐ, unary plus ์—ฐ์‚ฐ์ž๋Š” ToNumber() ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•˜๋ฏ€๋กœ ์ตœ์ข…์ ์œผ๋กœ ์ˆซ์ž 0์ด ๋œ๋‹ค.
[5] ++๋Š” ์ž์‹ ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ PutValue()์— ๋„ฃ๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด [] ๋‹จ๋…์œผ๋กœ๋Š” primitive๋กœ ์ทจ๊ธ‰๋˜๋ฏ€๋กœ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ PutValue() ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ReferenceError๋ฅผ ๋‚ธ๋‹ค.
[6] ๋ฐฐ์—ด ์•ˆ์— ์žˆ๋Š” ๋ฐฐ์—ด์„ [0]์ด๋ผ๋Š” ๋ฐฐ์—ด ์ ‘๊ทผ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ๊บผ๋ƒˆ์œผ๋ฏ€๋กœ ์ด๋Š” ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์ƒ์„ฑ๋œ ์ƒํƒœ์ด๋‹ค.
[7] ๋‹ค๋ฅธ ํƒ€์ž… ๊ฐ„์˜ ๋”ํ•˜๊ธฐ์ด๋ฏ€๋กœ toString() ์ฒ˜๋ฆฌ ํ›„ ๋‘ ๋ฌธ์ž์—ด์„ ๋ถ™์ด๋Š” ๊ฒƒ์ด ๋œ๋‹ค.
[8] ++ ์—ฐ์‚ฐ์ž์˜ ๋ฆฌํ„ด ๊ฐ’์€ ToNumber() ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ์ˆซ์ž์ด๋ฏ€๋กœ ์•ž์„œ ๋ฐ›์•„์˜จ ๋ฌธ์ž์—ด "1"์€ ์ˆซ์ž 1์ด ๋œ๋‹ค.
[10] ์‚ฌ์‹ค 'o', '('๋Š” ํšจ์œจ์„ฑ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ ์•ž์— ๋ฌธ์ž์—ด 'true', 'false'๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•œ๋‹ค.
[11] ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณ€์ˆ˜๋ช…์œผ๋กœ $๋‚˜ _๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
[12] ์‹ฌ์ง€์–ด ๋ช‡๋ช‡ ๋Œ€๋ฌธ์ž๋„ ์—ฌ๊ธฐ์— ๋“ค์–ด๊ฐ„๋‹ค! ์˜ˆ๋ฅผ ๋“ค์–ด ์†Œ๋ฌธ์ž a๋Š” 15๊ธ€์ž๋ฉด ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, ๋Œ€๋ฌธ์ž A๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด 726๊ธ€์ž๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ์‹ฌ์ง€์–ด ๋Œ€๋ฌธ์ž K๋Š” 5,609๊ธ€์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์†Œ๋ฌธ์ž ์ค‘์—์„œ๋Š” z๊ฐ€ 1,807์ž๋กœ ๊ฐ€์žฅ ๋งŽ์€ ๊ธ€์ž ์ˆ˜๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค.
[13] [!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]
[14] [!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]