CodeEngn Write Up/Advance

CodeEngn Advance RCE L09 Write Up

서원근양학계정 2022. 6. 1. 23:41

Password는 무엇인가

https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 세미나, 워크숍을 현업 실무자들과 함께 운영하고 있는 비영리 커뮤니티입니다.

ch.codeengn.com

 

먼저 문제 파일을 실행시켜보겠습니다.

 

Password를 구하라고 했는데 Username을 입력받네요. 

일단 아무 값이나 입력해보겠습니다.

 

그렇다고 합니다.

이제 ExeinfoPe를 이용해서 정적 분석을 해보겠습니다.

 

딱히 특별한 것은 없어보입니다.

이제 OllyDBG를 이용해서 본격적인 분석을 시작하겠습니다.

 

창이 상당히 더럽네요;;;

0x007613FF에서 핵심적인 연산을 하는 것을 확인했습니다.

들어가서 자세히 살펴보도록 하겠습니다.

 

이 부분에서 두 번의 비교를 하고 두 번 모두 통과하면 성공메시지를 출력합니다.

먼저 BL을 0이 아니게 해보겠습니다.

 

이 부분에서 입력한 Username의 문자와 ECX의 주소에 있는 값을 비교하는데 그 값이 0x00입니다.

비교를 해서 값이 다르면 

 

이 부분에서 BL의 값이 0이 되고

 

비교하는 부분에서 실패하는 쪽으로 점프합니다.

따라서 비교하는 값과 입력한 값이 같게 해주어야합니다.

하지만 0x00을 정상적인 방법으로는 입력할 수 없으므로 직접 메모리 값을 수정하면서 이 부분을 지나가야 합니다.

또한 0x00을 정상적인 방법으로 입력할 수는 없으므로 Username을 구할 수도 없습니다.

어쨌든 BL을 0이 아니게 하는 것은 성공했습니다.

 

이제 두 번째 조건인 [ESP+B]의 값이 0이 아니게 해보겠습니다.

일단 아래를 살펴보면 반복문이 하나 더 있습니다.

 

저는 첫 번째 반복분에서 Username을 비교했으므로 당연히 이 반복문에서 Password의 값을 비교할 것이라고 생각했습니다.

하지만 이 부분에서 Username을 DonaldDuck문자열과 다시 한 번 비교합니다.

저는 이 부분에서 이상함을 느끼고 [ESP+B]에 직접 값을 넣는 부분을 찾아보려했습니다.

하지만 발견할 수 없었고 그래서 저는 [ESP+B]에 HW BP를 걸고 실행시켜보았습니다.

하지만 ESP의 값이 항상 바뀌어서 이것또한 실패했습니다.

그래서 침착하게 코드를 분석하다가 먼저 BL을 0이 아니게 하는 코드 바로 아래에 SETE명령어가 있었고

 

[ESP+F]의 값을 바꾸는 것을 확인할 수 있습니다.

그리고 놀랍게도 이 [ESP+F]와 [ESP+B]가 같은 값을 가진다는 사실을 알게되었습니다.

그 이유는 이 부분에서 [ESP+F]에 값을 넣는 부분과 [ESP+B]의 값을 비교하는 부분 사이에 함수를 호출하는 부분이 있고,

PUSH와 ADD ESP, 0xC로 인해서 ESP의 값이 바뀌기 때문입니다.

어쨌든 비교하는 부분으로 돌아가서

 

비교할 때의 값을 살펴보면

 

제가 입력한 값인 0x4D2(1234)와 0x88228F를 비교하는 모습을 확인할 수 있습니다.

0x88228F는 10진수로 8921743이므로 문제의 정답은 8921743가 될 것입니다.

 

속임수가 많아서 까다로운 문제였네요.

 

Flag: 8921743

'CodeEngn Write Up > Advance' 카테고리의 다른 글

CodeEngn Advance RCE L11 Write Up  (4) 2022.08.19
CodeEngn Advance RCE L08 Write Up  (3) 2022.05.29
CodeEngn Advance RCE L07 Write Up  (8) 2022.05.28
CodeEngn Advance RCE L06 Write Up  (2) 2022.05.19
CodeEngn Advance RCE L05 Write Up  (2) 2022.05.19