[Reversing.kr] PEPassword

#REVERSING

Reversing.kr의 PEPassword 문제풀이


Reversing.krPEPassword문제인데 처음에 감을 못 잡아서 시간을 많이 허비했다.

동봉된 프로그램은 2개인데 왜 2개가 제공된 건지 처음에 이유를 도통 알지 못했다.

original.exe의 실행화면은 아래인데 Flag를 보여주지 않는다. original.exe 같이 제공된 packed.exe은 비밀번호를 입력 받는 창이 나온다. packed.exe

original.exe은 바이너리 분석해도 별로 얻는 것이 없다. 문자열 연산이 나오는데 이 연산의 결과는 메세지박스에 보이는 ????? 이다.

packed.exe는 우선 기본적으로 IATAPI리스트가 나오지 않는다. LoadLibraryA()GetProcAddress()를 이용해서 필요한 함수를 직접 불러와서 사용한다.

중단점을 걸고 둘러보다 보니 0x409078에서 폼을 띄운다. 409078

문자열을 입력받고 검증하는 곳이 존재할텐데 어딘지를 몰라서 우선 ret이 보이는 곳마다 중단점을 걸고 실행하고 문자를 입력하니 40919FF(ret 문)에서 멈추고 진행하면 409190 SendMessageA가 등장한다.

409190

4091D8함수에서 입력받은 문자열로 작업을 하고 리턴 값이 E98F842A 인지 확인하는데 여기에 빠지면 안된다.

위 비교문을 무시하고 아래로 오면 아래 분기문이 나오는데 정상적인 상황에서는 계속 문자열만 입력받는다. 저 분기문을 je로 패치하던가 ZF를 1로 바꿔서 안에 EndDialog 부분으로 들어가야 된다.

4091a6

EndDialog가 호출되면 폼이 사라지는데 프로그램이 끝났다고 생각하면 안된다. 아직 안 끝났다. 아래로 계속 진행하다보면 이 문제의 핵심 로직이 나온다.

409200

반복문을 돌면서 .text영역의 값들을 바꾼다. 이 값들을 original.exe.text 영역과 같도록 바꿔줘야 된다.

40921F에서 original.exe의 401000과 401004와 같은 값으로 바꿀 수 있는 eax 값은 순서대로 B7AAC2965A5A7E05이다.

eax의 값의 변화는 ebx에 의해 결정되는데

즉, EAX의 값이 B7AAC296 -> 5A5A7E05가 되는 EBX를 찾는 문제다.

처음에 간단히 역연산으로 될 줄 알고 시간을 너무 허비했는데 결국 답은 브루트 포스다.

#include <stdio.h>
 
int main() {
    int firstEAX = 0xB7AAC296;
    int nextEAX = 0x5A5A7E05;
    int i = 0, temp = 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%x\n", i);
 
        if (i == 0xffffffff) break;
        i++;
    }
 
    return 0;
}

위 브루트 포스 C코드를 돌리면 ebx 값이 나오는데 그걸 넣고 F9를 누르면 클리어다.

correct

(진짜 삽질하기 좋은 문제라고 생각한다. 처음에 packed.exe에 넣는 패스워드를 찾는 문제인 줄 알았다.)