난독화를 이해하기 위해 난독화 해제 도구인 Malzilla를 이용하여 실습을 진행해 보았다.
난독화
난독화는 프로그래밍 언어로 작성된 코드를 사람이 읽기 어렵게 만드는 방법이다.
이를 통해 개발자는 자신의 프로그램이 역공학을 통해 분석되는 것을 방지할 수 있지만
악위적인 사용자 또한 자신의 악성코드에서 나타날 수 있는 식별자(URL, IP주소, 악성 파일 경로 등)를 숨길 수 있다.
난독화 방법은 아주 다양하지만 몇가지만 설명하면 다음과 같다.
1. 코드 내 변수명을 알기 어렵도록 설정
2. 실행에 관여하지 않는 쓸모없는 코드들을 추가
3. 생소한 인코딩을 사용하여 이해하기 어렵도록 변환
4. 복잡한 함수를 이용하여 문자나 제어 흐름을 이해하기 어렵게 설정
이러한 과정을 통해 사람은 이해하기 어렵지만 프로그램은 정상 동작하도록 만든다.
문자 인코딩
인코딩은 문자나 기호를 컴퓨터가 이해하기 쉽도록 변환하는 것을 말하며 반대로 되돌리는 것은 디코딩이라고 한다.
ASCII : 7bit를 사용하여 128개의 문자 표현하는 방식으로 대/소문자, 숫자, 일부 특수문자를 표현할 수 있다.
문자는 10진수 혹은 16진수로 표현된다.
HELLO -> 72 69 76 76 79
UNICODE : 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하기 위해 설계된 방식이다.
유니코드는 각 글자마다 고유의 코드 값을 가지며 문자가 많아짐에 따라 크기가 계속해서 확장되고 있다.
형식은 'U+hhhh' 로 h는 16진수이다.
안녕 -> U+C548 U+B155
UTF-8 : 유니코드를 이용한 인코딩 방식으로 유니코드값을 재조합하여 3byte로 표현한다.
Web, DB, Linux 등에서 사용되는 한글 인코딩 방식이다.
EUC-kr : 아스키코드처럼 코드표에 매칭되는 값을 찾아 표현한다.
MS windows에서 사용하는 한글 인코딩 방식이다.
BASE64 : 데이터를 6bit씩 쪼개어 base64 코드표에 맞게 변환하는 방식이다.
아스키 코드의 전송 문제를 해결하기 위해 사용한다.
대/소/숫자를 활용하여 표현하고 빈 부분은 '='문자로 채우기 때문에 식별하기 쉽다.
HELLO -> SEVMTE8=
Hexadecimal : 16진수 표현으로 %hh 와 같은 형식으로 사용한다.
구분자로는 % 나 \x를 사용하며 아래는 아스키를 표현한 모습이다.
HELLO -> %48 %45 %4C %4C %4F
-> \x48\x45\x4C\x4C\x4F
UCS-2 : 유니코드를 표현하는 형식으로 %uhhhh 로 2byte를 표현한다.
구분자로 %u를 사용한다.
안녕 -> %uC548 %uB155
Malzilla
Malzilla는 난독화 해제 및 리다이렉션 분석, 디코딩 등 악성코드/페이지 분석에 많은 기능을 제공하는 도구이다.
우리는 Decoding과 Misc Decoding 기능을 이용해 여러 난독화된 코드들을 분석하고 식별자를 찾아볼 것이다.
실습
여러가지 인코딩된 문자열이나 알아보기 어려운 코드들을 Malzilla로 난독화 해제해본다.
첫번째 문제
UGFzc3dvcmQgaXMgV2ViaGFja2Vy
이 코드는 대/소문자와 숫자로만 구성되있음을 보아 base64를 의심해볼 수 있다.
Malzilla에 이 값을 붙여놓고 base64 decode를 진행해보자
'Password is Webhacker'라는 값이 도출되었다.
두번째 문제
%45%6E%63%6F%64%69%6E%67%20%69%73%20%76%65%72%79%20%68%61%72%64
이 코드는 %로 구분되어 hex(16진수) 코드임을 짐작해볼 수 있다.
Decode Hex (%) 기능을 이용해 디코딩을 진행해보자
'Encoding is very hard'라는 값을 찾을 수 있다.
세번째 문제
다음은 난독화된 코드의 한 예이다.
var Mal="%FE%E9%FA%A8%D7%B8%F0%EB%B0%BD%ED%B5%D3%AA%D4%F0%BC%B9%D4%F0%BC%BA%D4%F0%BC%BB%D4%F0%BC%BC%D4%F0%BC%BD%D4%F0%BC%BE%D4%F0%BC%BF%D4%F0%BC%B0%D4%F0%BC%B1%D4%F0%BC%C9%D4%F0%BC%CA%D4%F0%BC%CB%D4%F0%BC%CC%D4%F0%BC%CD%D4%F0%BC%CE%D4%F0%BD%B8%D4%F0%BD%B9%D4%F0%BD%BA%D4%F0%BD%BB%D4%F0%BD%BC%D4%F0%BD%BD%D4%F0%BD%BE%D4%F0%BD%BF%D4%F0%BD%B0%D4%F0%BD%B1%D4%F0%BD%C9%D4%F0%BE%B9%D4%F0%BE%BA%D4%F0%BE%BB%D4%F0%BE%BC%D4%F0%BE%BD%D4%F0%BE%BE%D4%F0%BE%BF%D4%F0%BE%B0%D4%F0%BE%B1%D4%F0%BE%C9%D4%F0%BE%CA%D4%F0%BE%CB%D4%F0%BE%CC%D4%F0%BE%CD%D4%F0%BE%CE%D4%F0%BF%B8%D4%F0%BF%B9%D4%F0%BF%BA%D4%F0%BF%BB%D4%F0%BF%BC%D4%F0%BF%BD%D4%F0%BF%BE%D4%F0%BF%BF%D4%F0%BF%B0%D4%F0%BF%B1%D4%F0%BF%C9%D4%F0%BB%B8%D4%F0%BB%B9%D4%F0%BB%BA%D4%F0%BB%BB%D4%F0%BB%BC%D4%F0%BB%BD%D4%F0%BB%BE%D4%F0%BB%BF%D4%F0%BB%B0%D4%F0%BB%B1%D4%F0%BA%CA%D4%F0%BA%CE%D4%F0%BB%CC%AA%A4%AA%D4%F0%BD%BD%D4%F0%BC%BF%D4%F0%BC%BE%D4%F0%BF%C9%D4%F0%BE%BB%D4%F0%BB%BB%D4%F0%BE%BC%D4%F0%BF%BE%D4%F0%BE%BB%D4%F0%BE%CC%D4%F0%BD%B9%D4%F0%BE%BF%D4%F0%BE%B9%D4%F0%BD%B0%D4%F0%BC%CC%D4%F0%BE%BF%D4%F0%BD%BC%D4%F0%BD%BF%D4%F0%BC%BE%D4%F0%BF%C9%D4%F0%BE%BB%D4%F0%BB%B9%D4%F0%BC%CD%D4%F0%BD%BA%D4%F0%BD%BC%D4%F0%BC%BD%D4%F0%BE%CB%D4%F0%BF%BD%D4%F0%BE%B9%D4%F0%BE%CC%D4%F0%BD%BE%D4%F0%BE%C9%D4%F0%BE%BC%D4%F0%BC%BF%D4%F0%BE%CB%D4%F0%BF%BE%D4%F0%BE%BA%D4%F0%BE%BF%D4%F0%BB%CC%D4%F0%BB%CC%AA%A4%AA%AA%A4%AA%D4%F0%BD%BB%D4%F0%BE%B9%D4%F0%BF%B1%D4%F0%BC%B0%D4%F0%BE%BD%D4%F0%BE%CB%D4%F0%BE%CB%D4%F0%BE%CE%AA%A4%AA%D4%F0%BC%BF%D4%F0%BE%BD%D4%F0%BF%BC%D4%F0%BC%BB%D4%F0%BE%CE%D4%F0%BF%BD%D4%F0%BE%CD%D4%F0%BF%BC%AA%A4%AA%D4%F0%BD%B8%D4%F0%BE%B9%D4%F0%BF%BB%D4%F0%BF%BB%D4%F0%BF%BF%D4%F0%BE%CE%D4%F0%BF%BA%D4%F0%BE%BC%AA%A4%AA%D4%F0%BF%BA%D4%F0%BE%BD%D4%F0%BF%B8%D4%F0%BE%CB%D4%F0%BE%B9%D4%F0%BE%BB%D4%F0%BE%BD%AA%A4%AA%D4%F0%BE%BB%D4%F0%BE%B0%D4%F0%BE%B9%D4%F0%BF%BA%D4%F0%BC%B9%D4%F0%BF%BC%AA%A4%AA%D4%F0%BE%B1%D4%F0%BE%CD%D4%F0%BE%BC%D4%F0%BE%BD%D4%F0%BF%B0%D4%F0%BC%CE%D4%F0%BE%BE%AA%A4%AA%D4%F0%BE%BE%D4%F0%BF%BA%D4%F0%BE%CE%D4%F0%BE%CC%D4%F0%BC%BB%D4%F0%BE%B0%D4%F0%BE%B9%D4%F0%BF%BA%D4%F0%BC%BB%D4%F0%BE%CE%D4%F0%BE%BC%D4%F0%BE%BD%AA%A4%AA%D4%F0%BE%CB%D4%F0%BE%BD%D4%F0%BE%CD%D4%F0%BE%BF%D4%F0%BF%BC%D4%F0%BE%B0%AA%A4%AA%D4%F0%BD%BF%D4%F0%BE%B9%D4%F0%BF%BA%D4%F0%BE%CD%D4%F0%BE%B1%D4%F0%BE%CD%D4%F0%BE%BF%D4%F0%BA%B8%D4%F0%BB%C9%D4%F0%BA%B8%AA%A4%AA%D4%F0%BC%CC%D4%F0%BE%B9%D4%F0%BE%CB%D4%F0%BE%B1%D4%F0%BE%BB%D4%F0%BE%B1%D4%F0%BE%CE%D4%F0%BF%BD%D4%F0%BF%BB%D4%F0%BA%B8%D4%F0%BC%BB%D4%F0%BE%CE%D4%F0%BE%BC%D4%F0%BE%BD%D4%F0%BA%B8%D4%F0%BD%BB%D4%F0%BF%BC%D4%F0%BE%B9%D4%F0%BF%BA%D4%F0%BF%BC%AA%D5%B3%EE%FD%E6%EB%FC%E1%E7%E6%A8%C6%ED%FF%C7%EA%E2%ED%EB%FC%A0%D7%B8%F0%BB%BF%E9%EB%F0%BA%A1%F3%FE%E9%FA%A8%D7%B8%F0%BB%BF%E9%EB%F0%BB%B5%B8%B3%FE%E9%FA%A8%D7%B8%F0%BB%BF%E9%EB%F0%BC%B5%D7%B8%F0%EB%B0%BD%ED%D3%B8%D5%B3%FE%E9%FA%A8%D7%B8%F0%BB%BF%E9%EB%F0%BD%B5%D7%B8%F0%EB%B0%BD%ED%D3%B9%D5%B3%FE%E9%FA%A8%D7%B8%F0%BB%BF%E9%EB%F0%BE%B5%D7%B8%F0%EB%B0%BD%ED%D3%BA%D5%B3%FE%E9%FA%A8%D7%B8%F0%BB%BF%E9%EB%F0%BF%A4%D7%B8%F0%BB%BF%E9%EB%F0%B0%A4%D7%B8%F0%BB%BF%E9%EB%F0%B1%A4%D7%B8%F0%BB%BF%E9%EB%F0%E9%A4%D7%B8%F0%BB%BF%E9%EB%F0%EA%A4%D7%B8%F0%BB%BF%E9%EB%F0%EB%A4%D7%B8%F0%BB%BF%E9%EB%F0%EC%B5%D7%B8%F0%EB%B0%BD%ED%D3%BA%D5%B3%FE%E9%FA%A8%D7%B8%F0%BB%BF%E9%EB%F0%ED%B5%B8%B3%FC%E0%E1%FB%D3%D7%B8%F0%EB%B0%BD%ED%D3%BB%D5%D5%B5%EE%FD%E6%EB%FC%E1%E7%E6%A8%A0%D7%B8%F0%BB%BF%E9%EB%F0%EE%A1%F3%D7%B8%F0%BB%BF%E9%EB%F0%BB%A3%A3%B3%E9%E4%ED%FA%FC%A0%D7%B8%F0%BB%BF%E9%EB%F0%BA%A3%D7%B8%F0%BB%BF%E9%EB%F0%EE%A1%B3%F5%A8%B3%FC%E0%E1%FB%D3%D7%B8%F0%EB%B0%BD%ED%D3%BC%D5%D5%B5%EE%FD%E6%EB%FC%E1%E7%E6%A8%A0%A1%F3%FA%ED%FC%FD%FA%E6%A8%D7%B8%F0%BB%BF%E9%EB%F0%BB%B3%F5%A8%B3%FC%E0%E1%FB%D3%D7%B8%F0%EB%B0%BD%ED%D3%BD%D5%D5%B5%EE%FD%E6%EB%FC%E1%E7%E6%A8%A0%A1%F3%D7%B8%F0%BB%BF%E9%EB%F0%BD%B5%D7%B8%F0%BB%BF%E9%EB%F0%BD%D3%D7%B8%F0%EB%B0%BD%ED%D3%BE%D5%D5%A0%A7%D3%D6%C9%A5%D2%E9%A5%F2%B8%A5%B1%D4%A3%D4%A7%D4%B5%D5%A7%EF%A4%D7%B8%F0%EB%B0%BD%ED%D3%BA%D5%A1%B3%EC%E7%F3%D7%B8%F0%BB%BF%E9%EB%F0%E9%B5%D7%B8%F0%BB%BF%E9%EB%F0%BC%D3%D7%B8%F0%EB%B0%BD%ED%D3%B0%D5%D5%A0%D7%B8%F0%BB%BF%E9%EB%F0%BD%D3%D7%B8%F0%EB%B0%BD%ED%D3%BF%D5%D5%A0%D7%B8%F0%BB%BF%E9%EB%F0%ED%A3%A3%A1%A1%B3%D7%B8%F0%BB%BF%E9%EB%F0%EA%B5%D7%B8%F0%BB%BF%E9%EB%F0%BC%D3%D7%B8%F0%EB%B0%BD%ED%D3%B0%D5%D5%A0%D7%B8%F0%BB%BF%E9%EB%F0%BD%D3%D7%B8%F0%EB%B0%BD%ED%D3%BF%D5%D5%A0%D7%B8%F0%BB%BF%E9%EB%F0%ED%A3%A3%A1%A1%B3%D7%B8%F0%BB%BF%E9%EB%F0%EB%B5%D7%B8%F0%BB%BF%E9%EB%F0%BC%D3%D7%B8%F0%EB%B0%BD%ED%D3%B0%D5%D5%A0%D7%B8%F0%BB%BF%E9%EB%F0%BD%D3%D7%B8%F0%EB%B0%BD%ED%D3%BF%D5%D5%A0%D7%B8%F0%BB%BF%E9%EB%F0%ED%A3%A3%A1%A1%B3%D7%B8%F0%BB%BF%E9%EB%F0%EC%B5%D7%B8%F0%BB%BF%E9%EB%F0%BC%D3%D7%B8%F0%EB%B0%BD%ED%D3%B0%D5%D5%A0%D7%B8%F0%BB%BF%E9%EB%F0%BD%D3%D7%B8%F0%EB%B0%BD%ED%D3%BF%D5%D5%A0%D7%B8%F0%BB%BF%E9%EB%F0%ED%A3%A3%A1%A1%B3%D7%B8%F0%BB%BF%E9%EB%F0%BF%B5%A0%D7%B8%F0%BB%BF%E9%EB%F0%E9%B4%B4%BA%A1%F4%A0%D7%B8%F0%BB%BF%E9%EB%F0%EA%B6%B6%BC%A1%B3%D7%B8%F0%BB%BF%E9%EB%F0%B0%B5%A0%A0%D7%B8%F0%BB%BF%E9%EB%F0%EA%AE%B9%BD%A1%B4%B4%BC%A1%F4%A0%D7%B8%F0%BB%BF%E9%EB%F0%EB%B6%B6%BA%A1%B3%D7%B8%F0%BB%BF%E9%EB%F0%B1%B5%A0%A0%D7%B8%F0%BB%BF%E9%EB%F0%EB%AE%BB%A1%B4%B4%BE%A1%F4%D7%B8%F0%BB%BF%E9%EB%F0%EC%B3%D7%B8%F0%BB%BF%E9%EB%F0%BE%B5%D7%B8%F0%BB%BF%E9%EB%F0%BE%A3%DB%FC%FA%E1%E6%EF%D3%D7%B8%F0%EB%B0%BD%ED%D3%B1%D5%D5%A0%D7%B8%F0%BB%BF%E9%EB%F0%BF%A1%B3%E1%EE%A0%D7%B8%F0%BB%BF%E9%EB%F0%EB%A9%B5%BE%BC%A1%F3%D7%B8%F0%BB%BF%E9%EB%F0%BE%B5%D7%B8%F0%BB%BF%E9%EB%F0%BE%A3%DB%FC%FA%E1%E6%EF%D3%D7%B8%F0%EB%B0%BD%ED%D3%B1%D5%D5%A0%D7%B8%F0%BB%BF%E9%EB%F0%B0%A1%B3%F5%A8%B3%E1%EE%A0%D7%B8%F0%BB%BF%E9%EB%F0%EC%A9%B5%BE%BC%A1%F3%D7%B8%F0%BB%BF%E9%EB%F0%BE%B5%D7%B8%F0%BB%BF%E9%EB%F0%BE%A3%DB%FC%FA%E1%E6%EF%D3%D7%B8%F0%EB%B0%BD%ED%D3%B1%D5%D5%A0%D7%B8%F0%BB%BF%E9%EB%F0%B1%A1%B3%F5%A8%B3%D7%B8%F0%BB%BF%E9%EB%F0%BF%B5%D7%B8%F0%BB%BF%E9%EB%F0%B0%B5%D7%B8%F0%BB%BF%E9%EB%F0%B1%B5%D7%B8%F0%EB%B0%BD%ED%D3%BA%D5%B3%D7%B8%F0%BB%BF%E9%EB%F0%E9%B5%D7%B8%F0%BB%BF%E9%EB%F0%EA%B5%D7%B8%F0%BB%BF%E9%EB%F0%EB%B5%D7%B8%F0%BB%BF%E9%EB%F0%EC%B5%D7%B8%F0%EB%B0%BD%ED%D3%BA%D5%B3%F5%A8%FF%E0%E1%E4%ED%A0%D7%B8%F0%BB%BF%E9%EB%F0%ED%B4%D7%B8%F0%BB%BF%E9%EB%F0%BD%D3%D7%B8%F0%EB%B0%BD%ED%D3%B9%B8%D5%D5%A1%B3%B3%FA%ED%FC%FD%FA%E6%A8%FD%E6%ED%FB%EB%E9%F8%ED%A0%D7%B8%F0%BB%BF%E9%EB%F0%BE%A1%B3%F5%A8%B3%F5%A8%B3%FE%E9%FA%A8%E7%EA%E2%B5%A8%E6%ED%FF%A8%C6%ED%FF%C7%EA%E2%ED%EB%FC%A0%D7%B8%F0%EB%B0%BD%ED%D3%B9%B9%D5%A1%B3%E7%EA%E2%A6%DB%E9%F1%C0%ED%E4%E4%E7%A0%D7%B8%F0%EB%B0%BD%ED%D3%B9%BA%D5%A1%B3";
pass = unescape(Mal);
function boot(){
var key = arguments.callee.toString().replace(/\W/g,"");
if(key.length == 136){
var en = "";
for( i=0; i < pass.length; i++ ) {
en += String.fromCharCode(pass.charCodeAt(i)^key.length);
}
eval(en);
}
}
boot();
해당 코드를 분석하기 위해 Malzilla를 이용해 스크립트를 실행할 것이다.
이때 유의할 점은 eval() 함수가 실제로 작동했을 때 컴퓨터에 악영향을 줄 수 있음으로 Replace eval() with 기능을 이용해 다른 쓸모없는 이름으로 바꾸어 작동하지 않도록 해준다.
Run script시 나오는 경고는 Ignore 한다.
아래와 같이 어떤 16진수 배열을 확인할 수 있다. 우리는 이 값이 무엇인지 확인해 볼 것이다.
해당 값을 복사해서 Misc Decoders 메뉴로 붙여넣는다.
그리고 순수한 hex 값만을 확인하기 위해 replace 기능으로 [" ,] 문자를 제거한다.
이렇게 도출된 값을 복사하여 Hex 메뉴에 paste as hex를 이용하면 숨겨진 문자열을 찾을 수 있다.
여기서 끝난 것 같지만 사실 내용에는 숨겨진 것이 하나 더 있다.
우선 악성 코드 내에서 ABC ~ 9+/= 이런식의 문자 나열이 발견되는 경우 base64를 사용한 것을 의심할 수 있다.
그 뒤에 오는 문장을 보면 읽을 수 없는 문자열이 ==로 끝나기 때문에 이는 base64 디코딩을 해 볼 필요가 있는 것이다.
해당 문장을 넣고 다시한번 Base64 decode를 진행하면 'Password is MassSQLInjection'라는 문자열을 찾을 수 있을 것이다.
우리는 이를 통해 난독화와 인코딩에 대해 알고 그리고 Malzilla를 이용한 난독화 해제로 숨겨진 문자열을 찾아내었다.
참조
https://ko.wikipedia.org/wiki/%EB%82%9C%EB%8F%85%ED%99%94
https://www.ibm.com/docs/ko/db2/11.1?topic=support-unicode-character-encoding
'보안 이론 > 웹 보안' 카테고리의 다른 글
(2021) OWASP TOP 10에 대해서 (0) | 2022.09.13 |
---|---|
Web Shell 업로드 우회 실습 (0) | 2022.09.13 |
Netcat을 이용한 백도어와 Reverse Shell 실습 (0) | 2022.09.06 |
간이 서버 이용 Web Shell 실습 (0) | 2022.09.06 |
HTTPS와 SSL/TLS (2) | 2022.09.05 |