문제풀이/CodeEngn

[CodeEngn] basic 17 문제풀이 과정

ILV_쉱이 2022. 1. 12. 16:22
728x90
반응형

 


CodeEngn 사이트

https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

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

ch.codeengn.com

위 사이트에서 Basic 17문제입니다

다운로드 받으시고, 압축 푸시면 비밀번호입력이 나오게 됩니다. 비번은 'CodeEngn'입니다.

 


Basic 17번 문제

 

Key는 ‘BEDA-02F56-BC4F4368-08A71-0870B‘이고, Name은 한자리이며, 이것은 알파벳일수도 있고, 숫자 일 수도 있습니다. 정답인증은 MD5 해쉬값입니다.

 


Basic 17번 문제 풀이

 

코드엔진 bASIC 17문제를 실행하면 다음과 같이 뜹니다.

이 주어진 KEY값을 입력하고 NAME은 'A'를 입력하여 어떠한 것이 변화가 되는지 확인하였습니다

위에 뜬 것처럼 ‘Please Enter More Chars...’이라 나옵니다.

이 것은 Name을 비교할 때, 어떠한 조건이 걸려있는 것이라 판단하여, 문자열을 비교하는 구문을 찾아보았습니다.

 

앞서 다른 문제에 언급된 것처럼

문자열 참조를 통하여 ‘Please Enter More Chars...’ 부분을 찾아 BP를 걸어놓았습니다.

F9를 실행하여 BP걸어논 곳까지 이동하였습니다.

하지만 바로 끝이 났고, F8로 이동하여 확인하니까 [0x0045BB24 ‘cmp eax,3’] 이라는 비교 구문이 있었습니다.

이것은 사용자가 입력한 문자열이 3자리 이상인지 확인하여 3자리 이하면 문자열이 출력되도록 만들었다. 그러므로 ‘cmp eax.3’을 ‘cmp eax,1’로 변경하여 저장하였습니다.

변경하는 이유는 Name이 1글자라는 힌트가 있기 때문입니다.

 

또는 jmp문을 이용하여 [0x0045BB39 ‘jmp b17.45BBCF’]부분에서 ‘45BBCF’를 ‘45BB75’으로 변경하여 Name 값을 추출하는 곳으로 점프한다. 변경되었다면, 패치를 통해 바꿔줍니다. 이때 원본에 덮어쓰기 하지말고, 따로 사본을 만듭니다.

 

패치한 파일을 만들어 똑같이 실행합니다.

위 그림을 보시면 [0x0045BBA4 ‘call b17.4043C’]이 부분은 Name값을 통해 Serial 값을 호출하는 부분입니다. 또한 바로 위에 있는 [call b17.45B850’]은 Name을 이용하여 Serial 값을 만드는 부분이라 생각하게 되었습니다.

 만드는 부분인 b17.45B850을 ‘F7’하여 들어갑니다. 그 후 F8로 한 단계씩 진행하니 계산하는 부분이 있었습니다.

위 그림은‘call b17.45B850’을 ‘F7’하여 들어간 부분입니다. 이 부분은 Name을 이용하여 Serial을 만드는 부분이라 주의 깊게 바라보았습니다. 만약 ‘45B850’이 끝나면 ‘EDX’부분에 ‘45B850’에서 생성된 Serial값이 저장되었습니다.

 

사용자가 입력한 A값이 시리얼을 통해 ‘FFE3’으로 나오기 때문에 위 그림을 통해 코드로 변경하여 계산하였습니다.

 

아래는 python으로 짠 코드입니다. 나온 결과 값에서 beda가 포함된 값을 찾아서 10진수이므로 16진수로 변경하면 해당 ‘BEDA-02F56-BC4F4368-08A71-0870B’에 대한 Name이 됩니다.

위 그림에서 결과 값을 찾아보면 70 부분에 ’beda’가 있고 이 것을 16진수로 변경하면 46이 되고, 46은 아스키 코드에서 F가 됩니다.

따라서 Key의 값이 ‘BEDA-02F56-BC4F4368-08A71-0870B’ 일 때 Name은 ‘F’라는 것을 알 수 있습니다.

728x90
반응형