Layer7 과제

2022-05-09 난독화 과제[JavaScript]

kms0204 2022. 5. 9. 01:48

 

eval(
    function(p,a,c,k,e,r){
        e=function(c){
            return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))
        	};
        if(!''.replace(/^/,String)){
            while(c--)
            	r[e(c)]=k[c]||e(c);
            k=[function(e){return r[e]}];
            e=function(){return'\\w+'};
            c=1
        	};
        while(c--)
        if(k[c])
            p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);
        return p
    }
    
    ('2 7=B;e C(b,c){b.8||(b.8="");b.f||(b.f="\\4[D");b.5||(b.5="");b.3||(b.3="");b.h||(b.h="");2 d=`${b.3}${b.5}┎─\\4[6`;d+=`${b.3}${b.f}${b.8}\\4[6`;d+=`${b.3}${b.5}${"─".j(7-k(b.8||""))}─┒\\4[6`;l.n(d);r(2 o E F){2 s=7-k(o.t(x=>u(x)).t(x=>x.G(/\\4\\[[0-9]*m/g,\'\')).H(\' \'))-1;2 v=`${b.3}${b.5}┃\\4[6${b.3}${b.h}`;2 w=`${b.3}${b.5}${\' \'.j(s)}┃\\4[6`;l.n(v,...o,w)}2 y=`${b.3}${b.5}┖─${"─".j(7)}─┚\\4[6`;l.n(y);e u(a){z(I a==\'J\')p K.L(a)+" ";p a.M()}e k(a){2 q=a.A;r(2 i=0;i<a.A;i++)z(/[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/.N(a[i]))q+=1;p q}}',50,50,'||let|bgColor|x1b|boxColor|0m|maxLen|title|||||header|function|titleColor||fgColor||repeat|size|console||log|line|return|len|for|count|map|tostr|bodyHead|bodyTail||footer|if|length|120|printBox|33m|of|lines|replace|join|typeof|object|JSON|stringify|toString|test'.split('|'),0,{})
)

난독화된 위 코드를 알아볼 수 있는 JavaScript코드로 바꾸는 과제이다.

 

eval() 이란, 문자열로 표현된 코드를 실행하는 함수이다.

따라서 eval()안에 있는 내용은 모두 실행된다.

 

매개변수로 p,a,c,k,e,r 총 6개를 받는 함수를 만든다.

각각의 매개변수에 해당되는 내용은 마지막 줄에서 찾아볼 수 있다.

내용이 너무 긴데, 해석을 하면 

p = '2 7=B;e C(b,c){b.8||(b.8="");b.f||(b.f="\\4[D");b.5||(b.5="");b.3||(b.3="");b.h||(b.h="");2 d=`${b.3}${b.5}┎─\\4[6`;d+=`${b.3}${b.f}${b.8}\\4[6`;d+=`${b.3}${b.5}${"─".j(7-k(b.8||""))}─┒\\4[6`;l.n(d);r(2 o E F){2 s=7-k(o.t(x=>u(x)).t(x=>x.G(/\\4\\[[0-9]*m/g,\'\')).H(\' \'))-1;2 v=`${b.3}${b.5}┃\\4[6${b.3}${b.h}`;2 w=`${b.3}${b.5}${\' \'.j(s)}┃\\4[6`;l.n(v,...o,w)}2 y=`${b.3}${b.5}┖─${"─".j(7)}─┚\\4[6`;l.n(y);e u(a){z(I a==\'J\')p K.L(a)+" ";p a.M()}e k(a){2 q=a.A;r(2 i=0;i<a.A;i++)z(/[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/.N(a[i]))q+=1;p q}}'
a = 50
c = 50
k = ['', '', 'let', 'bgColor', 'x1b', 'boxColor', '0m', 'maxLen', 'title', '', '', '', '', 'header', 'function', 'titleColor', '', 'fgColor', '', 'repeat', 'size', 'console', '', 'log', 'line', 'return', 'len', 'for', 'count', 'map', 'tostr', 'bodyHead', 'bodyTail', '', 'footer', 'if', 'length', '120', 'printBox', '33m', 'of', 'lines', 'replace', 'join', 'typeof', 'object', 'JSON', 'stringify', 'toString', 'test']
e = 0
r = {}
이다.
 
e는 c를 매개변수로 하는 함수 객체이다.
그리고 c가 a보다 크거나 같다면, c를 a로 나누고 a보다 작다면, c를 a로 나눴을때의 나머지로 c를 초기화한다.

 

그때의 c가 35보다 크다면, c에 29를 더한 값을 아스키 코드로 변환하여 반환하고, 작거나 같다면 c를 36진수로 변환한 값을 문자열로 반환한다.
 

다음 if문은 "무조건" 참이므로, 사실상 의미없는 코드이다.

 

다음에 올 while문을 이해하기 위해서 매개변수 c를 확인해야한다.

c는 50이고, 조건이 c--이므로 c가 0이 아닐때까지, 총 50번 반복하는 while문이 선언되었다. 

c--에 의하여 c는 49부터 -1까지 총 50번 변하게 되고, "특정 연산"을 처리한다.

e를 '\\w+'를 반환하는 함수 객체로 초기화한다.

c를 1로 초기화한다. (위 while문에 의하여 c는 0인 상태에서 1로 초기화된 것이다.)

 

 

c가 1이므로 다음에 올 while문은 사실상 의미없다.

어처피 한번만 실행되기 때문이다.

while문의 조건인 c--에 의하여 c는 0되었고, k[c]가 0이 아니라면 p를 "어떤 연산"을 거친후 반환하고, 그렇지 않다면 그냥 반환한다.

 

 

 

 

 

eval를 console.log로 고쳐서 구한 코드.

let maxLen=120;
function printBox(b,c){
    b.title||(b.title="");
    b.titleColor||(b.titleColor="\x1b[33m");
    b.boxColor||(b.boxColor="");
    b.bgColor||(b.bgColor="");
    b.fgColor||(b.fgColor="");
    let header=`${b.bgColor}${b.boxColor}┎─\x1b[0m`;
    header+=`${b.bgColor}${b.titleColor}${b.title}\x1b[0m`;
    header+=`${b.bgColor}${b.boxColor}${"─".repeat(maxLen-size(b.title||""))}─┒\x1b[0m`;
    console.log(header);
    for(let line of lines){
        let count=maxLen-size(line.map(x=>tostr(x)).map(x=>x.replace(/\x1b\[[0-9]*m/g,'')).join(' '))-1;
        let bodyHead=`${b.bgColor}${b.boxColor}┃\x1b[0m${b.bgColor}${b.fgColor}`;
        let bodyTail=`${b.bgColor}${b.boxColor}${' '.repeat(count)}┃\x1b[0m`;
        console.log(bodyHead,...line,bodyTail)
    }
    let footer=`${b.bgColor}${b.boxColor}┖─${"─".repeat(maxLen)}─┚\x1b[0m`;
    console.log(footer);
    function tostr(a){
        if(typeof a=='object')
            return JSON.stringify(a)+" ";
        return a.toString()
    }
    function size(a){
        let len=a.length;
        for(let i=0;i<a.length;i++)
            if(/[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/.test(a[i]))
                len+=1;
        return len}
}