패스워드만 요구하는 문제이다.
실제 실행해보면, Username까지 입력해야 한다.
Ollydbg로 보면, Username이 바로 보인다. DonaldDuck으로 고정하고, Password를 찾자.
입력 루틴을 찾아 이동한 후,
입력 직후 호출하는 부분에 Breakpoint를 걸자
이후 긴 Push 문들을 거치고 아래의 cout 호출 구문까지 거치면
이렇게 다른 메시지가 출력된다.
이후 더 실행해봤지만, 그 이후에는 패스워드 비교 루틴이 안보여서, 그 앞에서 행한다고 생각하고, 다시 꼼꼼히 보았다.
그 전에 cout문 이후 아래의 JZ문은 무조건 통과할 수 밖에 없다. 위에서 BL을 0으로 설정한 후 건드리질 않기 때문이다.
JNZ로 수정해 이 루틴을 무시하도록 하자. 이미지에는 없지만, 바로 아래의 비교문은
Password가 맞는지 아닌지 지역 변수 flag로 설정된 값을 통해 분기한다.
이후 정적 분석을 통해 살펴보니, 이 함수 앞쪽에서 패스워드를 비교하고 있었다.
(주소가 앞과 다른 이유는 코드 패치한 후 그 바이너리로 재시작했으며, ASLR이 걸려 있어서 그런 것으로 추측된다.)
아래의 EAX에 들어있는 0xBC614E는 처음에 입력했던 12345678이다.
그 아래에 나오는 CMP문을 통해 EAX와 *ECX를 비교한다. EAX는 입력값이므로 후자가 Password이다.
확인삼아 입력해보면 패스워드임을 알 수 있다.
'[Wargame Write-up] > CodeEngn Challenges' 카테고리의 다른 글
[CodeEngn Challenges] Malware Analysis 04 (0) | 2016.10.09 |
---|---|
[CodeEngn Challenges] Malware Analysis 03 (0) | 2016.10.08 |
[CodeEngn Challenges] Malware Analysis 02 (0) | 2016.10.05 |
[CodeEngn Challenges] Advance RCE 08 (0) | 2016.10.04 |
[CodeEngn Challenges] Advance RCE 07 (0) | 2016.10.04 |