JS Obfuscation

2026. 3. 3. 21:32·Web Study
반응형

JS Obfuscation란?

JavaScript Obfuscation(난독화)로, 코드를 원래 기능은 유지한 채 사람이 읽고 분석하기 어렵게 변형시키는 기술이다.

 

핵심은 **이해를 어렵게 만든다** 

int a = 1
int a = ((123+34+350-34-350)*0)+1

 

위의 코드는 쉽게 볼 수 있지만, 다양한 함수 또는 방식을 이용해 코드가 눈에 잘 들어오지 않도록 만들 수 있다.


대표 기법

1. 식별자 변경

가장 기본적인 기법으로, 의미 있는 변수명/함수명을 전부 무의미한 이름으로 바꾼다.

chechPassword	userToken	isAdmin

위 코드처럼 이름만 봐도 역할이 보이는데 이를 _0x12ab, _0x9f3c 처럼 의미 없는 이름으로 바꾼다.

 

☞ 사람은 코드를 읽을 때 이름을 많이 본다. deleteUser() 라는 함수를 보면 " 아, 사용자 삭제구나"를 바로 이해한다.

그런데 이름이 _ex7e()로 바뀌면, 그 함수가 뭘 하는지 직접 따라가 봐야만 알 수 있다.
즉, 분석 시간을 늘리는데 효과가 있다.

 

But 난독화 중에서 비교적 약한 편이다.

이름만 이상할 뿐, 실제 동작 순서와 데이터 흐름은 그대로이기 때문이다. 차근차근 따라가면 결국 의미를 복원할 수 있다.

 

2. 문자열 숨기기

중요한 글자를 코드에 그대로 두지 않고, 숨기는 기법이다.

 예를 들어

/admin/delete	token	password	https://...

같은 문자열이 보이면, 코드를 잘 모르는 사람도 어느정도 목적을 짐작할 수 있다.

const endpoint = "/api/users";
const message = "Hello World";

console.log(message);
fetch(endpoint);
-----------------------------------------------
const _0x1a2b = ["Hello World", "/api/users"];

const message = _0x1a2b[0];
const endpoint = _0x1a2b[1];

console.log(message);
fetch(endpoint);
  • 다음과 같이 배열로 옮기고, 나중에 인덱스로 꺼내쓰는 방식
const encoded = "SGVsbG8gV29ybGQ=";
const message = atob(encoded);

console.log(message);
  • atob()는 base64로 인코딩된 문자열을 디코딩하는 함수
  • 문자열을 base64 인코딩

☞ 문자열도 실행 순간에는 다시 필요하다.
브라우저가 실제로 요청을 보내거나 화면을 바꾸려면, 결국 숨겨둔 문자열을 꺼내 써야 한다.

 

3. Control Flow Flatting

코드 흐름을 일부로 꼬아놓는 기법

원래는 순서대로 읽히던 코드를, 지금 몇 번인지 확인하고, 다음방 번호로 이동하게 끔 바꾸는 것

function accessPage(isLoggedIn, isAdmin) {
  if (!isLoggedIn) {
    return "login first";
  }

  if (!isAdmin) {
    return "access denied";
  }

  return "welcome admin";
}
-----------------------------------------------------
function accessPage(isLoggedIn, isAdmin) {
  let state = 0;
  let result;

  while (true) {
    switch (state) {
      case 0:
        if (!isLoggedIn) {
          result = "login first";
          state = 3;
        } else {
          state = 1;
        }
        break;

      case 1:
        if (!isAdmin) {
          result = "access denied";
          state = 3;
        } else {
          state = 2;
        }
        break;

      case 2:
        result = "welcome admin";
        state = 3;
        break;

      case 3:
        return result;
    }
  }
}
  • 결과는 같지만 읽기가 어려움
    지금 state가 몇 인지, 어느 case로 들어가야하는지 다음은 어느 state로 바뀌는지 봐야 하기 때문

☞ 사람이 읽을 때 직관을 깨기 위해, 디컴파일/정적 분석을 더 어렵게 하기 위해 사용
제어흐름이 복잡해질 뿐, 실제 실행 결과가 달라지는 건 아니다.

 

while과 switch를 자주 씀

 

4. Dead Code Injection

쓸모없는 코드를 일부로 섞는 기법이다.

쉽게, 중요한 내용 10줄만 보면 되는 문서에 헷갈리는 잡문 200줄을 끼워 넣는 것과 비슷하다.

function getMessage(isAdmin) {
  if (isAdmin) {
    return "welcome";
  }

  return "denied";
}
------------------------------------------------
function getMessage(isAdmin) {
  const noise = 12345;

  if (noise === 99999) {
    console.log("this never runs");
  }

  function unusedHelper() {
    return "not used";
  }

  if (isAdmin) {
    return "welcome";
  }

  if ("abc" === "xyz") {
    return unusedHelper();
  }

  return "denied";
}
  • 코드를 보는 사람만 피곤하게 만들고, 실제 프로그램 동작에는 거의 기여안함

☞ 분석자의 시간을 낭비시키기 위해, 핵심 로직을 잡음 속에 묻기 위해 사용

실행 경로를 기준으로 보면 결국 대부분은 안 쓰이는 코드다.

동적 분석이나 converge 관점으로 보면 꽤 많이 걸러진다.

5. 동적 코드 생성

문자열을 코드처럼 만들어 나중에 실행하는 방식이다.

 

대표적으로, 

  • eval
  • Function() 생성자

가 있다.

eval()은 문자열을 JavaScript 코드로 평가하고, Function()도 동적으로 함수를 만들지만 보안/성능 문제를 가진다고 한다.

 

eval()

const code = "console.log('Hello')";
eval(code);
---------------------------------------
const hidden = "Y29uc29sZS5sb2coJ0hlbGxvJyk=";
eval(atob(hidden));
  • 이런식으로 문자열을 더 숨겨서 가능

Function()

eval()과 달리 전역 스코프에서만 실행된다는 점

const run = new Function("console.log('Hello World')");
run();

 

setTimeout("..."), setInterval("...")

setTimeout("console.log('Hello')", 1000);
  • 1초 뒤에 문자열 코드처럼 실행한다는 뜻

 

☞ 실제 코드를 실행 직전까지 숨기기 위해, 정적 분석을 더 어렵게 만들기 위해, 여러 단계가 디코딩 후 마지막에 실행하기 위해서 사용

결국 실행 직전에 문자열이 완성되므로, 그 시점을 잡으면 실제 페이로드를 확인할 수 있음

 

그 외에도

  • 문자열로 코드를 만들어 실행
  • 한 줄로 뭉개기 

등 여러 가지 방식으로 난독화를 한다.

 

공격자 입장에서는 자신의 악성코드를 심어놓고, 보안 프로그램이나 보안 전문가들이 악성코드를 쉽게 찾아내고 분석하지 못하도록 시간을 끌기 위해 사용

방어 입장에서는 자신이 만든 웹사이트의 기술이나 알고리즘을 경쟁사가 훔쳐가지 못하게 (저작권 보호) 코드를 꽁꽁 숨길 때 사용


 

 

반응형

'Web Study' 카테고리의 다른 글

HTTP Session Hijacking  (0) 2026.03.04
Parameter Tampering Attack  (0) 2026.03.04
AWK Code Injection  (0) 2026.02.20
CVE-2022-29078  (0) 2026.02.19
Prototype Pollution  (0) 2026.02.14
'Web Study' 카테고리의 다른 글
  • HTTP Session Hijacking
  • Parameter Tampering Attack
  • AWK Code Injection
  • CVE-2022-29078
y3onbug5
y3onbug5
y3onbug5 님의 블로그 입니다.
  • y3onbug5
    y3onbug5 님의 블로그
    y3onbug5
  • 전체
    오늘
    어제
    • 분류 전체보기 (167) N
      • Alpacahack (19) N
      • Dreamhack 워게임 (49)
        • Lv.1 (40)
        • Lv.0 (4)
        • LV.2 (3)
        • LV.3 (2)
      • [Dreamhack] Web Beginner (3)
      • [Dreamhack] Web Hacking (17)
        • 웹 기초 지식 (4)
        • Cookie & Session (2)
        • Cross-Site Scripting(XSS) (1)
        • Cross-Site Request Forgery (1)
        • SQL Injection (4)
        • NoSQL Injection (2)
        • Command Injection (1)
        • File Vulnerability (1)
        • Server-Side Request Forgery (1)
      • [Dreamhack] Web Hacking Client-Side (10)
        • XSS Filtering Bypass (2)
        • Content Security Policy (CSP) (2)
        • CSRF,CORS Bypass (2)
        • Client-Side Template Injection (CSTI) (1)
        • CSS Injection (1)
        • Relative Path Overwrite (RPO) (1)
        • DOM Vulnerability (1)
      • [Dreamhack] Web Hacking Server-Side (15)
        • SQL Injection Advanced (4)
        • SQL Injection Advanced - Fingerprinting (2)
        • NoSQL Injection Advanced (3)
        • Command Injection Advanced - Web Servers (3)
        • File Vulnerability Advanced - Web Server (3)
      • [Dreamhack]Black-Box Penetration Testing (15)
        • DreamCommunity Penetration Testing (11)
      • [Dreamhack] LLM (2)
        • [Dreamhack] LLM과 프롬프트 엔지니어링 (2)
      • Web 공부 (4)
      • Web Study (15)
      • JavaScript (17)
        • 기초 (12)
        • 중급 (4)
      • 웹 개발(Flask) (0)
      • [Security First] web 기초교육 (1) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    webstudy
    xss
    CSRF
    webhacking
    드림핵
    web
    cve
    hacking
    LLM
    JavaScript
    DreamHack
    alpacahack
    JS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
y3onbug5
JS Obfuscation
상단으로

티스토리툴바