본문 바로가기

Wargame/Reversing-W

reversing kr PE Password

문제를 받아 zip파일을 풀면 이렇게 두 프로그램이 나온다.



Original.exe 를 실행시키면

위 그림과 같이 메세지박스하나가 뜬다.



그리고 Packed.exe를 실행시키면

Password를 체크한다.

근데 이 박스안에 들어가는 패스워드를 찾는 문제는 아닌 것 같다.



어쨌든, 메시지박스에서 메시지를 받아오는것이므로

SendMessageA 함수에 브레이크포인트를 걸고 실행시키면

문자를 받아와서 어떤 한 함수를 실행시킨다.

그리고나서 EAX와 E98F842A를 비교하고

결과에 따라서 점프를 하는데, 저 점프문을 패치해주지않으면

아무리해도 입력만 하게되는 불상사를 낳을 수 있다.



위에서 점프문을 잘 패치하고 내려오다보면 이 함수 루틴을 만난다.

이 곳에서 바로 복호화를 진행해준다.

루틴은 위 그림을 보면 알 수 있다.



결국 저 복호화를 성공적으로 해 키 값을 출력하기 위해서는

Packed 의 00401000 eax, Original 의 00401000 eax,

Packed 의 00401004 eax, Original 의 00401004 eax,

가 필요하다. 그리고 각각 짝이 맞게 xor 연산을 해주면

값이 두개 나오게 되는데 그 값을 가지고 코드를 이용해서

브루트포싱을 하면 ebx의 값을 구할 수 있고,

그 ebx의 값과 xor한 eax의 값을 사용해서

강제로 바꿔주면 키 값이 뜨게된다.


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
#include <stdio.h>
 
int main()
{
    int firsteax = 0xB7AAC296, nexteax = 0x5A5A7E05;
    int temp = 0, i = 0;
    while (1)
    {
        _asm
        {
            mov eax, firsteax
            mov cl, al
            mov ebx, i
            rol ebx, cl
            xor eax, ebx
            mov cl, bh
            ror eax, cl
            add ebx, eax
            mov temp, eax
        }
        if (temp == nexteax)
            printf("0x%08x\n", i);
        
        if (i == 0xffffffff)
            break;
 
        i++;
    }
    return 0;
}
 
 


cs

이런 코드를 이용해서 ebx의 값을 구할 수 있다.

사실상 어셈코드는 저 위 복호화 그림의 어셈코드를 거의 그대로 가져온 것이다.



두 개의 ebx 값을 얻을 수 있다. 이걸 가지고 풀면 된다



복호화를 시작할 때의 모습이다.

여기서 EAX와 EBX 값을 바꿔주면 풀린다.



바꿔주고 실행하자.



키 값이 떴다. 끝.


반응형

'Wargame > Reversing-W' 카테고리의 다른 글

CodeEngn basic 15  (0) 2017.07.18
reversing kr CSHOP  (0) 2017.07.13
reversing kr ransomware  (0) 2017.07.12
reversing kr ImagePrc  (0) 2017.07.11
reversing kr Replace  (0) 2017.07.11