WEB] 자바스크립트 난독화

노션으로 옮김·2020년 3월 12일
0

Study

목록 보기
6/33
post-thumbnail

난독화

자바스크립트는 클라이언트에서 동작하는 언어이기 때문에 소스코드를 숨기기 위한 난독화가 필요하다.

https://4rgos.tistory.com/2

간단히 몇가지 난독화 종류가 정리된 블로그 글이다.
대부분 문자열 인코딩 방식이고 document.write로 코드를 작성한다.
그 중 마지막, 생성자를 이용한 난독화 방식을 확인해보자

생성자 난독화

jjencode라고도 부른다.
기호만 사용하여 자바스크립트 코드를 만드는 것이다.

예제

$=~[];

  • 자바스크립트는 $, _를 변수명으로 사용가능(맨앞, 단독 모두 가능)
  • []는 빈 배열오브젝트(0x0)이지만, 앞에 연산자가 붙으면 숫자로 변환된다.
    • ~ 는 자바스크립트 tilde 연산자로
    • 보수를 취한다
    • 따라서 0의 보수인 0xff, 즉 -1이 $에 저장된다.

$$$$:(![]+"")[++$]

  • !는 반대 논리값을 출력해주는 연산자이다.
  • !빈배열오브젝트(true) = false이다.
  • +"" 는 false를 문자열로 만들어준다.
    • 여기서 +는 문자열을 합쳐주는 기능같다.
    • alert("123"+ 123) 같은거
  • 저장되는 값은 "false"[0] = 'f' 이다
  • 이런식으로 원하는 문자를 가져오는걸 몽타주 문자라 한단다.

$_$$:({}+"")[(++$)+1]

  • {}는 +""연산에 의해 "[object Object]"라는 저장가능한 내장문자열로 치환된다.
  • $는 0이므로 인덱스 2의 값을 접근하므로
  • 저장되는 값은 'b' 이다

엔진

난독화한 코드를 구동시키는 방법이다.

다음처럼 선언되있다고 할 때,

 $.$$="return"
 $.$=(0)["constructor"]["constructor"];

위의 변수를 이용하여 원하는 함수를 호출한다.

$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\""+$.$_$_+"\\\");"+"\"")())();

위 표현은 아래와 같다.

$.$($.$(return"ale\162t(\"a\");")())();

결과는 alert('a')가 정상적으로 실행된다.

이유

위에서 선언한 $.$를 함수처럼 호출하고 있는데

#1

(0)["constructor"]["constructor"](함수내용) // is equal to $.$()

이처럼 호출할 경우, 해당 함수내용이 실행된다.

또한 특정 문자열을 코드로서 실행시키려고 할 때
다음처럼

"return alert('a')"

return 실행시키려는 코드를 문자열로 만들고
#1을 두번 호출하는 방식으로 해당 코드를 실행할 수 있다.

참조

http://www.hakawati.co.kr/226#recentComments

너무 잘 정리되어있다.

0개의 댓글