[Reversing.kr] PEPassword
#REVERSINGReversing.kr의 PEPassword 문제풀이
Reversing.kr의 PEPassword문제인데 처음에 감을 못 잡아서 시간을 많이 허비했다.
동봉된 프로그램은 2개인데 왜 2개가 제공된 건지 처음에 이유를 도통 알지 못했다.
original.exe의 실행화면은 아래인데 Flag를 보여주지 않는다. 같이 제공된 packed.exe은 비밀번호를 입력 받는 창이 나온다.
original.exe은 바이너리 분석해도 별로 얻는 것이 없다. 문자열 연산이 나오는데 이 연산의 결과는 메세지박스에 보이는 ????? 이다.
packed.exe는 우선 기본적으로 IAT에 API리스트가 나오지 않는다. LoadLibraryA()
와 GetProcAddress()
를 이용해서 필요한 함수를 직접 불러와서 사용한다.
중단점을 걸고 둘러보다 보니 0x409078
에서 폼을 띄운다.
문자열을 입력받고 검증하는 곳이 존재할텐데 어딘지를 몰라서 우선 ret
이 보이는 곳마다 중단점을 걸고 실행하고 문자를 입력하니
40919FF(ret 문)에서 멈추고 진행하면 409190 SendMessageA
가 등장한다.
4091D8함수에서 입력받은 문자열로 작업을 하고 리턴 값이 E98F842A 인지 확인하는데 여기에 빠지면 안된다.
위 비교문을 무시하고 아래로 오면 아래 분기문이 나오는데
정상적인 상황에서는 계속 문자열만 입력받는다. 저 분기문을 je
로 패치하던가 ZF
를 1로 바꿔서 안에 EndDialog 부분으로 들어가야 된다.
EndDialog
가 호출되면 폼이 사라지는데 프로그램이 끝났다고 생각하면 안된다. 아직 안 끝났다. 아래로 계속 진행하다보면 이 문제의 핵심 로직이 나온다.
반복문을 돌면서 .text
영역의 값들을 바꾼다. 이 값들을 original.exe의 .text 영역과 같도록 바꿔줘야 된다.
40921F
에서 original.exe의 401000과 401004와 같은 값으로 바꿀 수 있는 eax 값은 순서대로 B7AAC296
와 5A5A7E05
이다.
eax의 값의 변화는 ebx에 의해 결정되는데
즉, EAX의 값이 B7AAC296 -> 5A5A7E05가 되는 EBX를 찾는 문제다.
처음에 간단히 역연산으로 될 줄 알고 시간을 너무 허비했는데 결국 답은 브루트 포스다.
위 브루트 포스 C코드를 돌리면 ebx 값이 나오는데 그걸 넣고 F9를 누르면 클리어다.
(진짜 삽질하기 좋은 문제라고 생각한다. 처음에 packed.exe에 넣는 패스워드를 찾는 문제인 줄 알았다.)