본문 바로가기

2. Reversing (리버싱)/1) Write UP

[2021.11.20] CodeEngn Basic RCE L17, L18, L19, L20 풀이

Basic RCE L17

Key 값이 BEDA-2F56-BC4F4368-8A71-870B 일때 Name은 무엇인가

힌트 : Name은 한자리인데.. 알파벳일수도 있고 숫자일수도 있고..

정답인증은 Name MD5 해쉬값(대문자)

스트링 검색을 통해서 에러메세지, 성공 메시지를 찾고 에러 메시지를 확인해 보았다.

글자수가 세글자 미만일 때 에러 메시지가 출력된다.

문제에서 Name이 한글자라고 했고 비교하는 부분을 한글자인 1로 바꿔주고 실패 문자열 밑에 브레이크포인트를 걸고 실행한다.

1을 입력하고 Checkit 하면 시리얼을 만들어 낸다.

Call 0045b850이 시리얼을 만들어내고, 들어가보면 이부분을 통해 시리얼을 만들어낸다는 것을 알 수 있다. 따라서 해당 부분을 파이썬코드로 작성한다.

결과는 name : 70 + serial : 24e9bedaca60 이 나온다.

70 name이고, 이를 아스키코드로 바꾸면 F 이다. 이것을 MD5 해시로 바꾸면

 

 

코드엔진 18번

Name CodeEngn일때 Serial 무엇인가

파일을 실행하면 다음과 같이 nameserial을 입력하는 창이 뜬다. Name에는 CodeEngn, Serial에는 임의의 값을 입력한 후 check버튼을 눌러보니 “You serial is Wrong, try again” 창이 뜬다.

이 파일을 올리디버거를 통해 분석해보았다. 제일 먼저, You serial is Wrong, try again 텍스트 부분과 더불어 성공 메시지 텍스트 부분을 찾아보았다.

“You serial is Wrong, try again” 텍스트 아래에 성공 메시지 텍스트가 보인다.

또한 “You serial is Wrong, try again” 텍스트 위에는 string2string1라는 두 문자열을 비교하는 함수인 IstrcmpiA 함수가 보인다. 이 부분에 브레이크포인트를 걸고 실행시켜보았다.

String1에는 내가 입력한 임의의 문자열, string2에는 숫자가 나왔다. string2에 있는 06162370056B6AC0serial인 것 같아 입력해보았다.

정답 메시지가 뜬다.

따라서 serial06162370056B6AC0 이다.

 

 

 

코드엔진 19번

문제 : 프로그램은 밀리세컨드 후에 종료 되는가

패킹 되어있는 형태임을 확인 할 수 있음

성공적으로 언패킹 완료

차근차근 실행 시 위의 경고창 확인

안티 디버깅 함수인 IsDebuggerPresent()을 확인

안으로 들어가봄

Test eax,eax 명령어와 jnz 004338de라는 명령어가 존재

Zero가 아니면 00433de라는 주소로 건너뛰게 되는데 이때 저 주소에 들어가게 되면 아까 확인했떤 경고창을 띄우는 부분이기에 이를 막기 위해서 jnz 명령어 부분을 수정

이제 함수 검색

시간과 관련된 함수인 timeGetTime이라는 함수 발견 이 부분에 전부 브레이크포인트를 걸어줌

F9를 눌러 실행을 시키면 해당부분에서 멈추는 것을 확인

차근차근 f8을 눌러서 한줄씩 실행

디버깅 하다보면 jnb 00444D38 명령어를 통해 해당주소로 이동

SUB EAX, ESI -> CMP EAX,[EBX+4]라는 명령어 때문에 EAX에서 ESI를 빼고 그 값과 EBX +0x4와 비교하게 됨

EAX가 더 크면 00444C71로 분기하면서 종료됨 그렇지 않으면 EAX가 더 커져서 종료할때까지 과정 반복

따라서 EAX와 비교할 때 값이 00002B70임을 알 수 있음 10진수로 변환하면 11,120이 되어서 11120ms후에 종료됨을 알 수 있음

 

 

 

코드엔진 20번

이 프로그램은 Key파일을 필요로 하는 프로그램이다.
'Cracked by: CodeEngn!' 문구가 출력 되도록 하려면 crackme3.key 파일안의 데이터는 무엇이 되어야 하는가

Ex) 41424344454647
(
정답이 여러개 있는 문제로 인증시 맞지 않다고 나올 경우 Contact로 연락주시면 확인해드리겠습니다)

 

프로그램을 실행하였을 때의 화면

CreateFileA CRACKME3.KEY 이름의 key 파일이 있는지 찾고 만약 있다면 EAX 레지스터에 -1값을 반환.

제트플래그 값을 0으로 변경해주어 cracked 된 것과 같은 상황 만들어주기

4021A0 주소부터의 담긴 메모리 값이 18 바이트가 맞는지 확인

EAX 레지스터 값을 힌트 속 004020F9 주소에 값과 일치하게 변경해주기

기존 아스키 값에 ABCD…이 담겨 있었음.

아스키 값을 CodeEngn!으로 고쳐준 후 실행시키자 문제 해결