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,{}
)
)
노력과 한계
C언어를 할 때 배웠던 것처럼 세미콜론을 만났을 때 엔터를 눌러 줄바꿈을 해줬고, 함수나 괄호를 만났을 때 들여쓰기를 해주어 최대한 복호화하려고 노력했습니다.
그 결과 eval 안에 있는 내용은 복호화가 가능했지만, eval의 인자로 들어가는 부분은 복호화를 하지 못했습니다. 함수의 인자로 전달되는 내용들도 똑같은 방식으로 복호화를 하려 시도했으나, 람다 함수도 나오고 문자열 내에서 여러가지 포맷 문자가 나와 복호화 하는 데에 한계가 있었습니다.
복호화한 내용
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
}
(eval의 내용)
e라는 함수를 새롭게 정의해주었는데, 이 함수는 (인자로 전달된 값과 a를 비교해서 a가 더 크면 '', (작거나 같으면 c/a를 인자로 전달해 자기 자신을 다시 호출하고 그 값과 (c를 a로 나눈 값이 35보다 크면 1, 작거나 같으면 0)을 반환한 값을 더해 그 값이 35보다 크면 c+29번째 아스키코드를 리턴하고, 아니면 정수형 변수c를 문자열로 변환한 값을 리턶합니다))
그 다음은 if문을 수행하게 되는데, 이 if문의 조건은 void의 반대이므로 참이 나올 수 밖에 없습니다. 그렇게 이 if문을 실행하게 되면, c부터 시작해서 1까지 인자로 받은 r 배열의 r[e(c)]번째 값을 (k[c]번째 수와 e(c)의 반환 값이 둘 다 true면 1 아니면 0 반환)의 반환 값으로 정합니다. 그 후, 인자로 전달된 값을 e 함수에 넣은 반환값을 리턴하는 k 함수를 만들고, e 함수를 '\\w+'을 반환하는 함수로 바꾼 후, 반복문을 지난 후 0이 되었던 c를 1로 다시 바꿔주며 if문을 나가게 됩니다.
if문을 나가게 되면 새로운 반복문을 만나게 되는데, 이 반복문에서는 c가 0이 아닐 동안 반복하고 매 반복시마다 c를 감소시키는데, c는 현재 1이기 때문에 1번만 반복하고 끝내게 됩니다. 그리고 함수 내에 있는 조건문은 k[c]의 반환값이 true일 때인데, 아까 만난 조건문에서 k[c]는 e[c]로 정의했으므로 반드시 true가 되어 if문을 실행하게 됩니다. if문 안에서는 함수의 첫 인자인 p를 정규식으로 바꾼 값을 리턴하게 됩니다.
개선점
아직 js를 많이 접해보지 못해 문법이나 배경지식 등 부족한 것이 많습니다.
이번 복호화 문제를 풀다보니 C언어랑 다른 문법들이 많이 나와 간단한 코드를 해석하지 못하는 점이 많았습니다.
여러가지 문법을 접해보며 자연스럽게 사용할 수 있도록 익혀보도록 하겠습니다.
'programming' 카테고리의 다른 글
국민대학교 알고리즘 경시대회 후기 (0) | 2022.08.06 |
---|---|
선린인터넷고등학교 천하제일 코딩 대회 예선 3등 후기 (1) | 2022.06.12 |
C언어 4차시 Layer7 과제 - 백준 19941 (0) | 2022.04.17 |
C언어 4차시 Layer7 과제 - 백준 14467 (0) | 2022.04.17 |
C언어 4차시 Layer7 과제 - 백준 21966 (0) | 2022.04.17 |