본문 바로가기

[Riversing]/[코드엔진] BASIC

[코드엔진] basic17

코드엔진 사이트에 들어가 basic17 문제를 다운로드 받고 압축을 푼다(비밀번호 : codeengn)

 

이번엔 이전 문제들과 다르게 key 값을 주고 name을 찾는 문제이다.

 

우선 프로그램을 실행시켜보자.

 

주어진 key 값과 임의의 name 을 A 로 설정해서 입력했더니

더 많은 문자를 입력해야 한다고 뜬다.

 

하지만 힌트에서 name 은 한자리라고 해주었으니 우선 이부분을 찾아 수정해보자.

 

찾았다.

 

빨갛게 bp 걸어놓은 두 부분이 글자수로 분기되는 곳이다.

 

0045BB24 => cmp eax, 3 => 입력글자가 3글자 이상 이어야한다.

0045BB5E => cmp eax, 1E => 입력글자가 30글자 이하 이어야 한다.

 

우리가 알고있는 name 은 1글자이기 때문에 그냥 

0045BB24 의 명령어를 

                 CMP EAX, 1

로 바꿔주게 되면 더이상 Please Enter More Chars... 에러가 뜨지 않게 된다.

(패치버전으로 덤프시켜서 저장해야댐)

 

이제 name 에 관한 부분을 살펴보자.

 

이부분이 이제 성공으로 가는 분기점인데, 빨간색 동그라미 쳐놓은 부분을 보자.

EAX 에는 주어진 키값이 들어가 있고, EDX 에는 무언가 비슷한 형식의 다른 값이 들어있다.

 

0045BB9B 주소의 CALL 17_patch.0045B850 에서 어떠한 연산이 이루어 지기 때문인데

그 연산은 아래 사진과 같다.

 

살펴보니 ESI 와 EDX를 사용해서 연산을 하는데

우리가 입력한 값을 가지고 위의 연산과정을 거쳐 EDX에 저장, 그값을 key 값과 비교하는 형식이다.

 

A를 입력했을때의 값이 FFE3-xxxx-xxxxxx~ 이니까 

다른 나머지 한자릿수 값들을 넣었을때 나오는 결과가 BEDA-2F56-BC4F4368-8A71 이면 된다.

 

이 연산에는 4자리를 사용하니 BEDA~ 로 시작하는걸 찾으면 된다.

 

위의 연산을 아래와 같이 만들어준다.

 

 

아스키 문자표에서 한자리 문자(30~7A) 들을 순서대로 연산에 넣어 결과값을 보여주는 프로그램을 대충 짜봤다.

실행시켜보자.

 

 

찾았다. 

찾은 문자를 프로그램에 입력해보자.

 

성공!

'[Riversing] > [코드엔진] BASIC' 카테고리의 다른 글

[코드엔진] basic19  (0) 2020.04.06
[코드엔진] basic18  (0) 2020.04.06
[코드엔진] basic16  (0) 2020.04.04
[코드엔진] basic15  (0) 2020.04.04
[코드엔진] basic14  (0) 2020.04.01