코드엔진 사이트에 들어가 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 |