소스코드를 인터넷에 올리거나 고객에서 납품할때 프로그램 전반이 단순한 텍스트(코드)로 되어있기에 코드만 긁어가면 똑같은 서비스를 그대로 출시하거나 상업적 목적에 사용될 우려가 있다.

이러한 문제를 해결하기 위해 크게 3가지 기법(난독화, 바이너리 암호화, 패킹)이 있는데 해당 포스팅에선 주로 난독화에 대해 다루려고 한다.

바이너리 암호화

소스코드를 난독화 하는게 아닌 디컴파일 자체가 어렵도록 바이너리 자체를 암호화 하는것으로 복호화 없이는 실행될수 없는 파일이다.

복호화(디코딩)를 하기 위해선 별도의 실행프로그램이 존재해야하는데 이 프로그램을 로더라고 한다.

 

패킹 (Packing)

실행파일을 암호화하거나 압축하여 소스코드를 볼수 없도록 하는것 (패킹을 진행하는 프로그램을 패커라 칭한다)


난독화

프로그램을 변화하는 방법의 일종으로 코드를 읽기 어렵게 만들어 역공학을 통한 코드탈취를 막는기술이다.

JWT토큰, Base64, Cyberchef등이 이에 해당하는것이라 볼수있다.

  • 바이너리에서 심볼 정보를 제거하거나 변경하는것
  • 필요 이상으로 복잡한 코드 및 아무 의미도 없는 코드의 삽입
  • 각 함수를 인라이닝 및 반복되는 구문을 합쳐 익명함수를 만듬
  • 인코딩

장점

  • 난독화기는 난독화를 진행하면서 불필요한 코드를 찾아 제거하여 코드의 최적화를 만들어준다.
  • 리버스 엔지니어링을 어렵게 해주는것인데 이것은 오픈소스 플랫폼에서 코드탈취를 막아줄수 있다

단점

  • 난독화된 코드의 복잡성에 따라 코드를 해석하는데 긴 시간이 든다.
  • 난독화는 그저 해석이 어렵게 할뿐 시간만 주면 해석 못할건 아니다
  • 일부 백신 프로그램은 사이트에 난독화 코드가 있는경우 이것을 바이러스 사이트로 인지한다

코드 난독화의 종류

이름변경 난독화

  • 변수의 이름을 바꿔 기존 의도에 혼란을 주는것

데이터 난독화

  • 집계 난독화 - 프로그램에 데이터가 저장되는 방식을 변경 (부모배열을 자식배열로 분할, 이를 프로그램 다른위치에 참조되도록 하는것
  • 저장 난독화 - 데이터가 메모리에 저장되는 방식을 변경으로 로컬 저장소 및 전역 저장소 사이에 변동을 주는것
  • 순서 난독화 - 프로그램, 코드스니펫의 동작의 변경없이 데이터의 순서를 변경
  • 문자열 암호화 - 읽을수 있는 문자열을 모두 암호화하여 읽을수 없는 코드를 생성 (프로그램이 실행되는 런타임시점에 암호해독이 필요하다)
  • 제어/코드 흐름 난독화 - 제어가 코드베이스의 한 섹션에서 다른 섹션으로 전달되는 방법은 프로그램 의도를 결정하는데 중요한 역할을하는데 이 사이에 사용되지 않을 불필요한 구문(데드코드)를 추가하는것

코드스니펫 (Code Snippet) - 코드조각, 재사용 가능한 소스코드를 가리키며 코드의 일부를 복붙할때 사용하기도 한다

디버그 난독화

  • 디버그 정보는 프로그램 흐름, 디컴파일, 재컴파일을 통해 프로그램의 결함 또는 핵심 정보를 아는데 사용되는데 이를 기반으로 코드의 탈취우려가 있다.
  • 디버그 정보에 대한 엑세스 중지하여 식별 가능한 정보의 제공을 일절 차단하는것

주소 난독화

  • 변환된 코드가 실행될때마다 코드의 가상주소와 프로그램의 데이터가 랜덤화가 진행
  • 리버스 엔지니어링 과정이 어려워지며 동시에 메모리 오류 취약점을 이용한 공격효과를 장담할수 없도록 만듦
  • 비 메모리 안전 언어(C,C+)를 사용하는경우 엑세스 오류같은 보안 취약성이 발생하는데  메모리 프로그래밍 오류를 이용하는경우

JavaScript 난독화

  • HTML의 난독화는 주로 HTML보단 JavaScript 위주로 변환된다 -> HTML을 해당 숫자코드로 변환, 복수의 메서드를 조합하여 수행 하는게 통상적 이지만 주로 서버측 보안 위주로 이뤄지기에 HFO (HTML Field Obfuscation) 는 생략되는경우가 많다
  • 주로 컴파일전 원본 소스코드 자체를 난독화하는 방식이 사용된다.
  • 문자열 배열 인코딩, 유니코드 표현식으로 변환, 이스케이프 시퀀스에 유니코드 작업을 수행하는 등 작업을 진행
  • 런타임 속도가 느려짐

이스케이프 스퀀스 (escape sequence) - 프로그래밍 언어 특성상 표현불가능한 기능, 문자를 표현해주는것 (제어 시퀀스, 확장 비트열, 이스케이프 문자라고도 한다 - \n, \\, \"...)

Java 난독화

  • Proguard, Dexguard - 자바 난독화 라이브러리
  • 상용프로그램은 배포전 난독화를 한번 진행하고 배포를한다.
  • 자바는 바이트코드로, 안드로이드는 dex로, 닷넷은 DLL로 컴파일하여 난독화 

'CS' 카테고리의 다른 글

IP, DNS, HTTP  (2) 2023.07.09
HTTP 헤더  (0) 2023.05.06
개발방법론  (0) 2023.05.02
인라이닝  (0) 2023.04.20
메모리 단편화  (0) 2023.04.08

+ Recent posts