• [ Reversing.kr ] PEpassword

    2020. 4. 14.

    by. ugonfor

    이쯤 되니까 너무 롸업 쓰기가 귀찮네요...

    일단 빨리 다 풀고

    나중에 다시 롸업쓰는걸로 ㅇㅇ...

     

    패킹된 값        오리지널

    0xb6e62e17 ^ 0x014cec81
    0xb7aac296

     

    0x57560000 ^ 0x0d0c7e05
    0x5a5a7e05

     

    00409228 | 33C3                     | xor eax,ebx                                        |
    0040922A | 8ACF                     | mov cl,bh                                          |
    0040922C | D3C8                     | ror eax,cl                                         |

    이게 언팩과정

    from z3 import*
    
    s = Solver()
    b = BitVec("ebx",32)
    s.insert(0x5a5a7e05 == ((0xb7aac296 ^ b)*0x100000001) >> (b&0x4))
    print(s.check())
    print(s.model().evaluate)
    print(hex(3991977107))

    브포코드

    근데 실패함 ㅋㅋ...

    #include <stdio.h>
    #define ROR(S,i) (((S)>>(i%32)) | ((S)<<(32-(i%32))))
    #define ROL(S,i) (((S)<<(i%32)) | ((S)>>(32-(i%32))))
    
    
    int main()
    {
        int i = 0;
    	int tmp[33] = { 0, };
    	int tmp2[33] = { 0, };
    	int eax = 0xB7AAC296;
    	int eax_2 = 0x5a5a7e05;
    
    	for (i = 0; i < 33; i++) {
    		tmp[i] = ROL(0x5a5a7e05, i);
    		printf("%d\t0x%x ",i, tmp[i]);
    		tmp2[i] = tmp[i] ^ 0xB7AAC296;
    		printf("\t0x%x\t0x%x\n", tmp2[i], ((tmp2[i]&0x0000ff00)>>8)&31);
    		if ((((tmp2[i] & 0x0000ff00) >> 8)&31) == i) printf("Ans : %x\n", tmp2[i]);
    	}
    
    	return 0;
    }
    ​

    좀더 한참 고민해서 나온 코드

     

    마지막에 에러떠서 그냥 하나는 내가 직접 1바이트 바꿔줌

     

    난이도 점점 어려워 지는 듯

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

    [ Reversing.kr ] CRC1  (2) 2020.07.17
    [ Reversing.kr ] Adventure  (0) 2020.04.15
    [ Reversing.kr ] WindowKernel  (0) 2020.04.13
    [ Reversing.kr ] Metroapp  (0) 2020.04.09
    [ Reversing.kr ] HateIntel  (0) 2020.04.08

    댓글