Post

(JS) char <> code <> hex / unicode 공백 / Unpack

hex
1
2
(65).toString(16)    // 41
"A".charCodeAt().toString(16) // 41
code to char
1
String.fromCharCode(0x41)    // "A"

JS는 유니코드가 16bit charset이었을 때 개발되었기 때문에 JS에서 한 문자는 기본적으로 2 bytes 유니코드다.

그러나 \x??로 직접 입력하는 경우 1 byte 씩 문자로 인식한다. 2 bytes 유니코드 문자를 사용하려면 \u를 사용해야 한다.

1
2
3
4
"\uc548"
""
"\xc5\x48"
"ÅH"

BMP를 넘어가는 경우(U+10000 이상) surrogate halves가 총 4 bytes이므로 length를 2로 인식한다. 그래서 UTF-16이라기 보다는 UCS-2에 가까우나 이를 한 문자로 표시하기 때문에 완전히 UCS-2같지는 않다.

1
2
3
4
5
6
7
8
9
10
11
"A" === "\u0041"

  


"\uD834\uDC06"         //  "𝀆"  BMP를 넘어가는 경우.
"\uD834\uDC06".length  // 2  한 문자지만 length는 2다.
String.fromCharCode(65586)  // "2"
String.fromCharCode(65586).charCodeAt()  // 50
String.fromCharCode(50)     // "2"
// 65536(0x10000) 부터 쪼개지는게 아니라 다시 0으로 되돌아간다.

유니코드 공백 문자 집합

1
\s == [\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]

JS unpacking

eval부터 끝까지 복사한다음, 브라우저 개발자 도구에서 console탭에 붙여넣기하고 eval을 console.log()또는 js alert()로 바꾼다.

eval()

setTimeout(), setinterval()은 함수 인수를 취하지만, eval() 처럼 문자열을 받아 실행할 수도 있다. 그러나 문자열 인수를 넘기는 것은 보안, 성능상 좋지 않다.

This post is licensed under CC BY 4.0 by the author.