CodeEngn Write Up/Advance

CodeEngn Advance RCE L08 Write Up

서원근양학계정 2022. 5. 29. 11:46

Key 값이 5D88-53B4-52A87D27-1D0D-5B09 일때 Name은 무엇인가
힌트 : Name은 두자리인데.. 알파벳일수도 있고 숫자일수도 있고..
정답인증은 Name의 MD5 해쉬값(대문자)

https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

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

ch.codeengn.com

 

먼저 문제 파일을 다운로드하고 압축을 푸는데 Advance RCE L06문제가 같이 들어있네요.

어쨌든 프로그램을 실행시켜보겠습니다.

 

Name이 두 자리라고 해서 두 글자를 입력했는데 더 입력하라고 하네요.

이 부분은 직접 수정해야 하는 것 같습니다.

어쨌든 ExeinfoPE를 이용해서 정적 분석을 진행해보겠습니다.

 

패킹이 되어있지는 않네요.

이제 OllyDBG를 이용해서 동적 분석을 진행해보겠습니다.

먼저 이 부분을 수정해서 Name에 두 자리를 입력할 수 있도록 합니다.

 

그리고 코드를 분석하다 보면 시리얼을 만드는 부분을 찾을 수 있습니다.

 

사실 이 문제는 Basic RCE L17과 같은 문제입니다.

하지만 Name이 두 글자라는 차이가 있습니다.

이 부분에 주의해서 분석해서 C언어 코드로 만들고 그 코드에 무차별적인 대입을 통해서 Name값을 구해보겠습니다.

#define _CRT_SECURE_NO_WARNINGS

#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int a = 0, b = 0;
	int i, j, k;

	for (i = 0; i <= 0xFF; i++)
	{
		for (j = 0; j <= 0xFF; j++)
		{
			for (k = 0; k <= 1; k++)
			{
				if (k == 0)
				{
					a = i;
				}
				else
				{
					a = j;
				}
				a += b;
				a *= 0x772;
				b = a;
				b *= a;
				a += b;
				a *= 0x474;
				a *= 0x2;
				b = a;
			}
			if (b >= 0x5D880000 && b <= 0x5D88FFFF)
			{
				printf("%X%X -> %X\n", i, j, b);
			}
			a = 0;
			b = 0;
		}
	}

	return 0;
}

 

이 코드를 실행시키면

 

이런 결과가 나옵니다.

두 가지 결과가 나오는데 0x93은 정상적인 방법으로 입력할 수 없는 값이므로 0x43과 0x36을 문자로 변환한 C6이 Name값이 될 것입니다.

정답 인증은 Name값의 MD5 해시값이므로 변환시켜주겠습니다.

 

hash darling, hash!

 

Flag: 7e8b9f5cab4a8fe24fad9fe4b7452702

'CodeEngn Write Up > Advance' 카테고리의 다른 글

CodeEngn Advance RCE L11 Write Up  (4) 2022.08.19
CodeEngn Advance RCE L09 Write Up  (7) 2022.06.01
CodeEngn Advance RCE L07 Write Up  (8) 2022.05.28
CodeEngn Advance RCE L06 Write Up  (2) 2022.05.19
CodeEngn Advance RCE L05 Write Up  (2) 2022.05.19