์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
1. ๊ฐ์[ํธ์ง]
JavaScript + BrainFuck = JSFuck
๋ํดํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์๋, ๋ํดํ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ. JavaScript ์ฝ๋๋ฅผ JavaScript ๋ฌธ๋ฒ์์ ์ฌ์ฉ๋๋ ๋ฌธ์ ์ค ๋จ 6๊ฐ์ง์ธ [ ] ( ) ! +๋ง์ผ๋ก ๊ตฌํํ ์ ์์์ ์ฐฉ์ํ์ฌ ๊ณ ์๋ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ด๋ค.
๋ํดํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์๋, ๋ํดํ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ. JavaScript ์ฝ๋๋ฅผ JavaScript ๋ฌธ๋ฒ์์ ์ฌ์ฉ๋๋ ๋ฌธ์ ์ค ๋จ 6๊ฐ์ง์ธ [ ] ( ) ! +๋ง์ผ๋ก ๊ตฌํํ ์ ์์์ ์ฐฉ์ํ์ฌ ๊ณ ์๋ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ด๋ค.
2. ์๋ฆฌ[ํธ์ง]
์ 6๊ฐ์ง ๋ฌธ์ ์ค ๋จ๋
์ผ๋ก ์จ์ ๋ฉ์ฉกํ ๊ฑด
[] (์ด๋ ์ด ๋ฆฌํฐ๋ด) ๋ฟ์ธ๋ฐ, ์ฌ๊ธฐ์์ ๋ชจ๋ ๊ฒ์ ์์ํ๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด ์ํ๋ฒณ ๋ฌธ์์ด "a" ๋ ๋ค์์ ๊ณผ์ ์ ์ํด ์ป์ด์ค๊ฒ ๋๋ค. ![] = false
๋ฐฐ์ด ์์ฒด๋ truthyํ ๊ฐ์ผ๋ก ์ธ์ ๋๋ฏ๋ก, ์ฌ๊ธฐ์ ๋ถ์ ์ ์๋ฏธํ๋!(๋๋ํ)๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉดfalse๊ฐ ๋์จ๋ค.- (๊ฐ์ฒด)
+[] = ""
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ค๋ธ์ ํธ ๊ฐ์+(๋ํ๊ธฐ) ์ฐ์ฐ์ ์ ์๋์ด ์์ง ์์ผ๋ฏ๋ก ์ค๋ธ์ ํธ๋ผ๋ฆฌ ๋ํ๊ฒ ๋๋ฉด.toString()(๋ฌธ์์ด๋ก ๋ณํ) ์ฒ๋ฆฌ๊ฐ ๋์ด ๋ฌธ์์ด ๊ฐ์ ๋ํ๊ธฐ๋ก ์ฒ๋ฆฌ๋๋ค. ์ค๋ธ์ ํธ๋ก ์ทจ๊ธ๋๋ ๋ฐฐ์ด์ ์ด์ฉํ์ฌ[] + []๋ฅผ ํ๊ฒ ๋๋ฉด[].toString() = ""์ด๋ฏ๋ก, ๊ฒฐ๊ณผ์ ์ผ๋ก"" + "" = ""(๋น ๋ฌธ์์ด)์ด ์์ฑ๋๋ค. false + "" = "false"
๋ถ์ธ ๊ฐ์ธfalse์ ๋น ๋ฌธ์์ด์ ๋ํ๊ฒ ๋๋ฉดfalse.toString() = "false"์ด๋ฏ๋ก"false"๋ผ๋ ๋ฌธ์์ด์ด ๋์ค๊ฒ ๋๋ค. ์์ ํ์ธํ ๋ด์ฉ์ ์กฐํฉํด๋ณด๋ฉด![]+([]+[]) = false + "" = "false"๊ฐ ๋๋ค.!![] = truefalse๋ฅผ ๋ถ์ ํ๋ฉดtrue๊ฐ ๋๋ค.+true = 1true์์ unary plus๋ฅผ ์ฐ๋ฉด ์ซ์ํ1๋ก ๋ณํ์ด ๋๋ค. # ์์ ์ป์ด์จ!![] = true์ ์์+๋ฅผ ๋ฃ์+!![]๋ ์ซ์1์ด ๋๋ค."false"[1] = "a"
์์ ์ป์ด์จ ๋ฌธ์์ด"false"์ ๋ ๋ฒ์งธ ์ํ๋ฒณ์ด a์ด๋ฏ๋ก"false"[1]์"a"๊ฐ ๋๋ค. 0๋ถํฐ ์ธ๋ ๊ฒ์ ์ฃผ์.- ์ง๊ธ๊น์ง ํ์ ํ ๋ด์ฉ๋ค์ ๋ชจ๋ ์ด์ผ๋ฉด
(![]+[])[+!![]]=(false + "")[+true]="false"[1]="a"๊ฐ ๋๋ค.ํด๋๋ค!!
์ด๋ฐ ์์ผ๋ก ์ํ๋ฒณ/์ซ์๋ฅผ ์ป์ด์ค๊ณ , ๊ฐ์ข ๋ด์ฅ ์ค๋ธ์ ํธ ๋ฑ์ ์ด์ฉํ์ฌ ํจ์ ๊ฐ์ฒด ๋ฑ์ ์ ๊ทผํ์ฌ ํจ์๋ฅผ ๋ง๋ค๊ณ ๋ ํธ์ถํ๋ ์ฝ๋๋ฅผ ์์ฑ, ์ต์ข ์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ์ค์ ๋ก ์ ํํ์ด์ง์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ฉด ์ฝ๋๋ฅผ ์์ 6๊ธ์๋ก ํํํ ์ ์๋๋ก ์นํํด์ JSFuck ์ฝ๋๋ฅผ ์์ฑํ๋ค. ๊ฐํน ์์ ๋ฐฉ๋ฒ๋ง์ผ๋ก๋ ํํํ ์ ์๋ ๋ฌธ์๊ฐ ๋ฑ์ฅํ์ ๊ฒฝ์ฐ ๋ฌธ์ ์ฝ๋๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ป๊ฒ๋ ํํผํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
3. ์์[ํธ์ง]
๋ค์์ JSFuck ์คํ์ผ๋ก ์์ฑ๋
๋ฌด๋ ค 1,227๊ธ์์ ๋ฌํ๋ ๊ฑฐ๋ํ ์ฝ๋...์ธ ๊ฒ ๊ฐ์ง๋ง, ์ฌ์ค ์ ๋ฏ์ด๋ณด๋ฉด1227๊ธ์ ์ค์ ๋ฌด๋ ค 1186๊ธ์๋ฅผ ๋ฌธ์์ด ๋ง๋๋ ๋ฐ ์ผ๋ค ECMA2015(ES6)๋ถํฐ๋
๋ ๋ค๋ฅธ ์์
๊ฐ๋จํ ์์ ๋ฅผ ํตํด ์ดํด๋ณด์.
alert(1) ํธ์ถ ํ๋ก๊ทธ๋จ์ด๋ค. ์๋ ํ
์คํธ๋ฅผ ๋ณต์ฌํ์ฌ ์น ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ ์ฝ์[1] ๋ฑ์ ๋ถ์ฌ๋ฃ๊ธฐ๋ฅผ ํ๋ฉด alert ์ฐฝ์ผ๋ก 1์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ฝ๋ ๋งจ ๋ค์ ()๋ฅผ ์๋ตํ๊ณ ๊ฐ๋ฐ์ ๋๊ตฌ ์ฝ์์ ์๋ ์ฝ๋๋ฅผ ์
๋ ฅํ๊ฒ ๋๋ฉด ํจ์๊ฐ ๋ง๋ค์ด์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[
]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]
])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+
(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+
!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![
]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]
+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[
+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!!
[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![
]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[
]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![
]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(!
[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])
[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(
!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[
])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()๋ฌด๋ ค 1,227๊ธ์์ ๋ฌํ๋ ๊ฑฐ๋ํ ์ฝ๋...์ธ ๊ฒ ๊ฐ์ง๋ง, ์ฌ์ค ์ ๋ฏ์ด๋ณด๋ฉด
[]["filter"]["constructor"]("alert(1)")()๋ก ์ค์ด๋๋ ๊ฒ์ ์ ์ ์๊ณ , ์ด๋ [].filter.constructor("alert(1)")() = Function("alert(1)")()์ผ๋ก ํด์๋์ด ์ต์ข
์ ์ผ๋ก๋ alert(1)์ด ์คํ๋๋ค. 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] ํ๋ฉด์ ์ผ๋ก ๋ฐ์ ์์นํ++์+๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ฌ ์ฝ๋๋ฅผ++[[]][+[]],+,[+[]]์ ์ธ ๋ถ๋ถ์ผ๋ก ์ดํดํ๋ค. - ์์ ๋ถ์๋๋ก
+[]๋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 ๋ฑ์ ๋ฌธ์์ด์
์ธ ๋ฐ ๋ฐํด, IE์์๋
๋ก ์ถ๋ ฅ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ ๋ณด๋ฉด ์๋ค์ ๊ฐํ ๋ฌธ์๊ฐ ๋ถ์ด ์์ด ๊ธ์๊ฐ ํ๋์ฉ ๋ฐ๋ฆฌ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ฃ์ง์์๋ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ํ๋์ง ์๋๋ค.
์ด๋ก ์ ์ผ๋ก๋
1,253์๋ก ๋ ๋์ด๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ, ๋ฌธ์์ด์ ์ถ์ถํ๋ ์ซ์์ ํด๋นํ๋ ๋ถ๋ถ์ ๊ณ ์ณค๊ธฐ ๋๋ฌธ์ด๋ค.
[]['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 ๊ณต๊ฒฉ ๋ฌธ์ ๊ฐ ์ถ์ ๋๊ณ ๋ ํ๋ค.
ํ์ง๋ง JSFuck ์์ฒด๋ฅผ ์ด์ฉํด ๊ณต๊ฒฉํ๊ธฐ์๋ ๋ค์ ๋ฌด๋ฆฌ๊ฐ ์๋๋ฐ ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ํ์ฉ ๊ฐ๋ฅํ ํน์ ๋ฌธ์๋ค[11]์ ์ด์ฉํด ์ง์ ์ฝ๋๋ฅผ ๋ง๋ค์ด ๊ณต๊ฒฉํ๋ ๊ฒ ์ผ๋ฐ์ ์ด๋ค. JSFuck ์์ฒด๋ฅผ ์ด์ฉํ๋ค๊ธฐ๋ณด๋ค๋ ์ด๋ฌํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฑ์ง๋ค์ ์ด์ฉํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
์๊ฒ์์ด๋ CTF์์ ๊ฐํน ์ด๋ฌํ ๋ฐฉ์์ ์ด์ฉํ XSS ๊ณต๊ฒฉ ๋ฌธ์ ๊ฐ ์ถ์ ๋๊ณ ๋ ํ๋ค.
5. ์ฌ๋ด[ํธ์ง]
์๋์ ํ์์ ๋ณผ ์ ์๋ฏ์ด ์๋ฐ์คํฌ๋ฆฝํธ ๋ด๋ถ์ ์ผ๋ก ๋ฐ๋ก ๋ง๋ค ์ ์๋ ํน์๋ฌธ์[12], ํนํ ํ๊ธ์ ๋ํด์ ์ทจ์ฝํ๋ค.
JSFuck์ด 6๊ฐ์ง ๋ฌธ์๋ก๋ง ํํ๋๋ ๊ฒ์ ์ฐฉ์ํด ์ฝ๋ ํ ๊ธ์๋น ๋นํธ์ ๊ณต๊ฐ์ ์ฐจ์งํ๋ค๊ณ ์น๊ณ (UTF-8 ๊ธฐ์ค์ผ๋ก) ์๋ฌธ๊ณผ JSFuck ์นํ ๊ฒฐ๊ณผ์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. ์ ํํ์ด์ง์์ ์ํ๋ ๋ฌธ์ฅ์ ์น๊ณ Eval Source(์ฝ๋๋ก ์ทจ๊ธ) ์ฒดํฌ๋ฅผ ํด์ ํ๋ฉด ์ค์ ๋ก ๋ช ๊ธ์๋ก ์นํ๋๋์ง ํ์ธํ ์ ์๋ค.
JSFuck์ด 6๊ฐ์ง ๋ฌธ์๋ก๋ง ํํ๋๋ ๊ฒ์ ์ฐฉ์ํด ์ฝ๋ ํ ๊ธ์๋น ๋นํธ์ ๊ณต๊ฐ์ ์ฐจ์งํ๋ค๊ณ ์น๊ณ (UTF-8 ๊ธฐ์ค์ผ๋ก) ์๋ฌธ๊ณผ JSFuck ์นํ ๊ฒฐ๊ณผ์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. ์ ํํ์ด์ง์์ ์ํ๋ ๋ฌธ์ฅ์ ์น๊ณ Eval Source(์ฝ๋๋ก ์ทจ๊ธ) ์ฒดํฌ๋ฅผ ํด์ ํ๋ฉด ์ค์ ๋ก ๋ช ๊ธ์๋ก ์นํ๋๋์ง ํ์ธํ ์ ์๋ค.
์๋ฌธ (๋ฐ์ดํธ ์) | JSFuck ๊ธ์ ์ (๋ฐ์ดํธ ์) | ์๋ฌธ ๋๋น ์ฉ๋ |
104,711๊ธ์ (์ฝ 33.04KB) | ์ฝ 75.86๋ฐฐ | |
๋ค๋์ฅ ํ ์ณ๋ฐํด์ ํ๊ณ ํ. (37๋ฐ์ดํธ) | 116,477๊ธ์ (์ฝ 36.75KB) | ์ฝ 1017.19๋ฐฐ |
๋๋ฌด์ํค, ์ฌ๋ฌ๋ถ์ด ๊ฐ๊พธ์ด ๋๊ฐ๋ ์ง์์ ๋๋ฌด. (64๋ฐ์ดํธ) | 201,606๊ธ์ (์ฝ 63.62KB) | ์ฝ 1017.86๋ฐฐ |
K (1๋ฐ์ดํธ) | 5,609๊ธ์ (์ฝ 8.12KB) | 5609๋ฐฐ |
[1] ์๋๋ฉด ์ฃผ์์ฐฝ์
javascript:๋ผ๊ณ ์น๊ณ ๊ทธ ๋ค์ ๋ถ์ฌ๋ฃ๊ณ ์ํฐ ์ณ๋ ๋๋ค.[3] unary plus ์ฐ์ฐ์๋ ToNumber() ์ฒ๋ฆฌ๋ฅผ ํ๋ค๊ณ ํ๋ค. ๋ฐ๋ผ์ ToNumber()๋ฅผ ํ์ธํด์ผ ํ๋ค. ToNumber()๋ ์ค๋ธ์ ํธ(๋ฐฐ์ด์ ์ค๋ธ์ ํธ ํ์
์ด๋ค)์ ๋ํด ToPrimitive() ์ฒ๋ฆฌ๋ฅผ ํ ๊ฒฐ๊ณผ๋ฌผ๋ก ToNumber() ์ฒ๋ฆฌ๋ฅผ ํ๋ค๊ณ ํ๋ ToPrimitive()๋ฅผ ๋ด์ผ ํ๋ค. ToPrimitive() ์ฒ๋ฆฌ๋ฅผ ์ํด์๋ DefaultValue ๋ด๋ถ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํด์ผ ํ๋ค. ๋ฐฐ์ด์ ๋ํ DefaultValue๋ toString() ์ฒ๋ฆฌ๋ผ๊ณ ํ๋ค. ๋ฐฐ์ด์ ๋ํ toString()์ ๊ฒฐ๊ณผ๋ฌผ์ .join() ๋ช
๋ น ํธ์ถ ๊ฒฐ๊ณผ๊ฐ ๋๋ฏ๋ก
""๊ฐ ๋๋ค.[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]
[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]