문제 파일을 실행하기 위해서는 .NET Framework 버전 4 이상이 필요합니다.
문제의 조건에 이렇게 써있다
.net 디컴파일러 dotpeek을 이용하면
ilGenerator.MarkLabel(label2);
ilGenerator.Emit(OpCodes.Ldloc_0); // 문자배열
ilGenerator.Emit(OpCodes.Ldloc_3); // i
ilGenerator.Emit(OpCodes.Ldelema, typeof (char)); // &문자배열[i]
ilGenerator.Emit(OpCodes.Dup); // &문자배열[i]의 복제
ilGenerator.Emit(OpCodes.Ldind_U2); // 문자배열[i]
ilGenerator.Emit(OpCodes.Ldloc_0);
ilGenerator.Emit(OpCodes.Ldloc_3);
ilGenerator.Emit(OpCodes.Ldc_I4_1);
ilGenerator.Emit(OpCodes.Add);
대략 이와 비슷한 값이 나온다
그리고 분석한 것을 바탕으로
c언어로 구성하면
#include <stdio.h>
int dec[] = {
0x94, 0x1b, 0x0E, 0x1b,
0x22, 0x19, 0x0A, 0x1E,
0x30, 0x21, 0x17, 0x0F,
0x13, 0x2b, 0x2e, 0x1E,
0x17, 0x0F, 0x13, 0x2b,
0x21, 0x22, 0x3C, 0x36,
0x31, 0x2f, 0x2a, 0x2a,
0x33, 0x50, 0x3f, 0x89
};
int flag[32] ={0,}; // 1단계 디코딩
int end_flag[32]= {0,}; // 2단계 디코딩
/*
0x21 ~ 0x7E 입력할 수 있는 값
*/
int main(){
int i=0,j=2, f0=0x44, f1=0x48, f2=0x7B,f31=0x7D,temp =0, temp1=0, temp2=0;
temp1 = f0^f1;
temp2 = f1^f2;
flag[31] = f31;
flag[0] = temp1;
flag[1] = temp2;
for(i =29;i>=0;i--){
flag[j] = dec[i] - temp2;
temp2 = flag[j];
j++;
}
end_flag[0] = f0;
end_flag[1] = f1;
end_flag[31] = f31;
printf("%c%c",end_flag[0],end_flag[1]);
for(i = 1;i<31;i++) {
temp = end_flag[i];
for(j=0x20;j<0x7E;j++)
{
if((temp ^ j) == flag[i]){
end_flag[i+1] = j;
printf("%c",end_flag[i+1]);
break;
}
}
}
return 0;
}
이렇게 된다
'호그와트' 카테고리의 다른 글
드림핵 jff3_magic (0) | 2022.01.18 |
---|---|
드림핵 tmitter (0) | 2022.01.18 |
드림핵 web-deserialize python (0) | 2022.01.18 |
드림핵 linux forest (0) | 2022.01.18 |
XSS와 CSRF의 차이점 (드림핵에서 누가 물어보길래) (0) | 2022.01.03 |