본문 바로가기

Reverse Engineering/CodeEngn Basic

[리버싱] CodeEngn Basic RCE L17

문제 설명


문제 풀이

파일은 다음과 같다.

 

이 부분을 살펴보아야 할 것 같다.

이 두 부분이 수상한데 아래는 30 단어가 넘으면 나오는 문장 같으니 위를 먼저 봐본다.

 

일단 입력한 값이 어떻게 되는지부터 확인해보자.

 

네임은 한자릿수라고 하니 한자릿수만 입력해주자.

 

다음과 같이 입력해주었다.

더 입력해주라고 뜬다.

 

아까 CMP문을 살펴보자.

해당 부분의 EAX 값을 확인해보니 내가 입력한 자릿수가 들어간 것을 확인할 수 있다...

 

이 부분을 1로 바꿔주자.

그리고 새로 저장하고 파일을 다시 열어주자.

 

45B850부분을 자세하게 살펴봐야한다. Ctrl+G로 찾아가주자.

이 부분이다. 이 부분에서는 name값을 이용하여 시리얼 번호를 만드는데, 이 코드를 이용하여 C코드를 짜면 위의 과제가 해결될 것이다.

 

코드는 다음과 같다.

#include <stdio.h>

int main(void)
{
ㅤㅤint ESI = 0, EDX = 0;

ㅤㅤfor (int i = 0x30; i <= 0x7A; i++) { //from 0 to z
		
ㅤㅤㅤㅤESI = i * 0x772; //IMUL ESI, ESI, 0x772
ㅤㅤㅤㅤEDX = ESI; //MOV EDX, ESI
ㅤㅤㅤㅤEDX *= ESI; //IMUL EDX, ESI
ㅤㅤㅤㅤESI += EDX; //ADD ESI, EDX
ㅤㅤㅤㅤESI *= 0x474; //IMUL ESI, ESI, 0x474
ㅤㅤㅤㅤESI += ESI; //ADD ESI, ESI
ㅤㅤㅤㅤEDX = ESI;
		
ㅤㅤㅤㅤprintf("%c >> %X\n", i, EDX); //생성된 시리얼 출력
ㅤㅤ}
ㅤㅤreturn 0;
}

 

이제 입력해주면된다.