본문 바로가기

[Wargame Write-up]/CodeEngn Challenges

[CodeEngn Challenges] Advance RCE 09

 

패스워드만 요구하는 문제이다.

 

실제 실행해보면, Username까지 입력해야 한다.

 

 

 

Ollydbg로 보면, Username이 바로 보인다. DonaldDuck으로 고정하고, Password를 찾자.

 

 

 

입력 루틴을 찾아 이동한 후,

 

 

 

입력 직후 호출하는 부분에 Breakpoint를 걸자

 

 

 

이후 긴 Push 문들을 거치고 아래의 cout 호출 구문까지 거치면

 

 

 

이렇게 다른 메시지가 출력된다.

 

 

 

이후 더 실행해봤지만, 그 이후에는 패스워드 비교 루틴이 안보여서, 그 앞에서 행한다고 생각하고, 다시 꼼꼼히 보았다.

 

그 전에 cout문 이후 아래의 JZ문은 무조건 통과할 수 밖에 없다. 위에서 BL을 0으로 설정한 후 건드리질 않기 때문이다.

 

 

 

JNZ로 수정해 이 루틴을 무시하도록 하자. 이미지에는 없지만, 바로 아래의 비교문은

 

Password가 맞는지 아닌지 지역 변수 flag로 설정된 값을 통해 분기한다.

 

 

 

이후 정적 분석을 통해 살펴보니, 이 함수 앞쪽에서 패스워드를 비교하고 있었다.

 

(주소가 앞과 다른 이유는 코드 패치한 후 그 바이너리로 재시작했으며, ASLR이 걸려 있어서 그런 것으로 추측된다.)

 

아래의 EAX에 들어있는 0xBC614E는 처음에 입력했던 12345678이다.

 

 

 

그 아래에 나오는 CMP문을 통해 EAX와 *ECX를 비교한다. EAX는 입력값이므로 후자가 Password이다.

 

 

 

확인삼아 입력해보면 패스워드임을 알 수 있다.