본문 바로가기
Wargame Write-Up/Reversing.kr

[Reversing.kr] CSHARP 풀이

by snwo 2021. 3. 20.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
        private static void MetMetMet(string sss)
        {
            byte[] bytes = Encoding.ASCII.GetBytes(Convert.ToBase64String(Encoding.ASCII.GetBytes(sss)));
            AssemblyName assemblyName = new AssemblyName("DynamicAssembly");
            TypeBuilder typeBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave).DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".exe").DefineType("RevKrT1", TypeAttributes.Public);
            MethodBuilder methodBuilder = typeBuilder.DefineMethod("MetMet", MethodAttributes.Private | MethodAttributes.Static, CallingConventions.Standard, nullnull);
            TypeBuilder typeBuilder2 = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave).DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".exe").DefineType("RevKrT2", TypeAttributes.Public);
            typeBuilder2.DefineMethod("MetM", MethodAttributes.Private | MethodAttributes.Static, CallingConventions.Standard, nullnew Type[]
            {
                typeof(byte[]),
                typeof(byte[])
            }).CreateMethodBody(Form1.bb, Form1.bb.Length);
            Type type = typeBuilder2.CreateType();
            MethodInfo method = type.GetMethod("MetM", BindingFlags.Static | BindingFlags.NonPublic);
            object obj = Activator.CreateInstance(type);
            byte[] array = new byte[]
            {
                1,
                2
            };
            method.Invoke(obj, new object[]
            {
                array,
                bytes
            });
            string str;
            if (array[0== 1)
            {
                str = "Wrong";
            }
            else
            {
                str = "Correct!!";
            }
cs

 

동적으로 함수를 호출하는 것같다. 입력값을 동적인 함수를 통해 비교하는 것같다.

 

이 함수가 그 동적인 함수같다.

Header 의 offset 의 0x52c 라고 한다. 기억하자.

 

이 부분이 동적인 함수를 복호화하는 부분이다. 

this 에서 Static members 에 들어가면

 

bb 가 보인다. 이거 못찾아서 몇일 걸렸다.

 

우클릭 -> show in memory window

 

헤더가 0x52c 에 있으니까, 적당히 0000 이 끝나는 곳에 (함수내용시작)

Ctrl+B 로 덮는다.

 

복호화 완료! 한글자씩 파이썬으로 노가다해서 찾으면 된다.