• [ Reversing.kr ] CSHARP

    2020. 2. 29.

    by. ugonfor

    .NET 파일이 리버싱하기가 제일 싫습니다....

    ㅜ ㅜ...

    어려운건 아닌데... 뭔가 UI가 보기가 힘들어.... dnSpy.... 후..

     

    리버싱을 시작해 봅시다.

     

    전형적인 크랙미같은 인풋값을 찾는 문제입니다.

     

    dnSpy로 열어보았죠.

    다들 열어보면 알겠지만, Form1()을 실행하길래 열어보고 확인해봤는 데, 딱히 특별한건 없었고, 중요한건

    여기 MetMetMet에 있었습니다.

    아래쪽 보면 array[0]의 값에 따라서 Correct Wrong이 변합니다. 그러면 array[0]의 값을 1이 아니게 잘 만들어주면 되겠네요. 근데 위에는 딱히 뭐 array값을 변화시켜주는 게 없고, 심지어 제가 브포 걸어둔 곳 바로 위에서 array를 정의하고, 브포건부분있고 그 아래에서 바로 array값을 확인하길래....

     

    아 Invoke이 함수에 뭔가가 있구나...

    하고서 브포를 걸었죠.

     

    그다음은 그냥 디버깅입니다. 디버깅해서 계속 step into를 하다보면

    이 친구를 만나요.

    // RevKrT2
    // Token: 0x06000001 RID: 1
    private static void MetM(byte[] A_0, byte[] A_1)
    {
    	if (A_1.Length == 12)
    	{
    		A_0[0] = 2;
    		if ((A_1[0] ^ 16) != 74)
    		{
    			A_0[0] = 1;
    		}
    		if ((A_1[3] ^ 51) != 70)
    		{
    			A_0[0] = 1;
    		}
    		if ((A_1[1] ^ 17) != 87)
    		{
    			A_0[0] = 1;
    		}
    		if ((A_1[2] ^ 33) != 77)
    		{
    			A_0[0] = 1;
    		}
    		if ((A_1[11] ^ 17) != 44)
    		{
    			A_0[0] = 1;
    		}
    		if ((A_1[8] ^ 144) != 241)
    		{
    			A_0[0] = 1;
    		}
    		if ((A_1[4] ^ 68) != 29)
    		{
    			A_0[0] = 1;
    		}
    		if ((A_1[5] ^ 102) != 49)
    		{
    			A_0[0] = 1;
    		}
    		if ((A_1[9] ^ 181) != 226)
    		{
    			A_0[0] = 1;
    		}
    		if ((A_1[7] ^ 160) != 238)
    		{
    			A_0[0] = 1;
    		}
    		if ((A_1[10] ^ 238) != 163)
    		{
    			A_0[0] = 1;
    		}
    		if ((A_1[6] ^ 51) != 117)
    		{
    			A_0[0] = 1;
    		}
    	}
    }

    딱봐도 뭔가 있죠?

     

    저거 값을 잘 만들어주면...

    저는 참고로 저기서 코드 가져와서 아래 코드 돌렸어요.

    #include <stdio.h>
    
    int main(void){
        char A_1[13] = {0,};
        (A_1[0] = 74 ^ 16) ;
        (A_1[3] = 70 ^ 51) ;
        (A_1[1] = 87 ^ 17) ;
        (A_1[2] = 77 ^ 33) ;
        (A_1[11] = 44  ^ 17);
        (A_1[8]  = 241 ^ 144);
        (A_1[4]  = 29 ^ 68) ;
        (A_1[5]  = 49 ^ 102);
        (A_1[9]  =  226 ^ 181);
        (A_1[7]  =  238 ^ 160);
        (A_1[10]= 163  ^238);
        (A_1[6] = 117 ^ 51);
    
        printf("%s",A_1);
    }

    여튼 이케 해주면, 나오는 게 base64로 인코딩된것이 나오는 데, 그거 잘 디코딩 해주면 

    ㅇㅇ!

    'Writeup > Wargame_Writeup' 카테고리의 다른 글

    [ Reversing.kr ] flashenc  (0) 2020.04.08
    [ Reversing.kr ] Twist1  (0) 2020.04.07
    [ Reversing.kr ] x64 Lotto Writeup  (0) 2020.02.28
    [ Reversing.kr ] CSHOP writeup  (0) 2020.02.28
    [ Reversing.kr ] AutoHotkey1 Writeup  (0) 2020.02.12

    댓글