반응형
17.exe
0.44MB
patched_17.exe
0.44MB


분석 1

반응형


델파이로 작성된 프로그램이다.


프로그램을 실행하면 위와 같이 나온다.


어떠한 값도 입력하지 않고 Check it!을 누르면 위와 같이 "Please Enter More Chars..." 문자열이 뜬다.


분석 2


위의 부분은 EP 코드 부분이다.

EP 코드에서 문자열 찾기 기능을 이용하니 위와 같은 문자열들이 떴는데, 분석 1에서 봤던 "Please Enter More Chars..." 문자열이 안 보인다.

45C76E 주소에 BP를 걸고 F9 키를 눌러 실행한 뒤 F7 키를 눌러 함수 안으로 들어간다.


위와 같이 458A70 주소의 함수 내부로 들어간 뒤 문자열 찾기에서 검색을 하니 위와 같이 문자열이 나왔다.

그럼 이 부분을 분석해야 한다.


"Please Enter More chars..." 문자열을 출력하는 부분으로 가기 전 45BB27 주소에서 조건 분기를 하는데 45BB24 주소에서 eax와 3을 비교하여 eax의 값이 3 이상이면 "Please Enter More chars..." 문자열을 건너뛰고 45BB3E 주소로 점프한다.

그렇다면 입력값이 3글자 이상이여야 "Please Enter More chars..." 문자열 출력 부분을 건너뛴다는 것이다.


문제에서 요구하는 것은 Name에 한 자리이 일 때이므로 위와 같이 cmp eax, 1로 수정한다


그리고 45BB3E 주소로 점프가 취해졌을 때

45BB57 주소의 je 명령어에서 eax 값이 0이면 45BB5E 주소로 점프하고, eax가 1Eh(30) 글자 이하인지 검사하여 이하이면 45BB75 주소로 점프한다.

즉, 입력한 값이 30글자를 넘어가는지 검사하는 부분으로 30글자 이내로 Key 값을 입력해야 한다.


그리고 위와 같이 "sean" / 12345를 입력하고 진행하다보면 45BB9B 주소에서 호출하는 45B850 주소의 함수가 수행되고 나면 위와 같이 Key 값이 생성된다.

그렇다면 Name 값을 이용해 Key 값을 만드는 곳이 45B850 주소의 함수이다.


45B850 함수 내부로 들어가면 첫 번째 루틴이 나오는데 이 루틴의 결과로 7번 스택을 0으로 채운다.


그리고 두 번째 루틴이 나오는데 루틴을 실행하기 전 eax에는 Name 값의 길이가 담긴다.

그리고 두 번째 루틴의 대략적인 동작은 Name에서 문자 하나를 가져와 esi에 옮기고 어떠한 연산을 거친 후 edx로 이동시킨다.

알고리즘
ecx 레지스터를 1로 초기화하고
ebp-4에 있는 값은 Name 항목에 입력했던 값의 주소인데 해당 주소 값을 ebx에 저장한다.
Name 항목에 적었던 문자열의 문자 하나 하나를 가져와 esi에 저장하고
esi 값에 edx 값을 더한 뒤 772와 곱하고 edx로 옮긴 후 edx에 저장된 값과 더한다.
더한 값을 esi 값과 곱하고 곱한 값에 edx의 값을 더한 다음 해당 더한 값을 or 연산 해주고 474와 곱한 후 곱한 값에 곱한 값을 더하고 해당 값을 edx에 옮긴 후 ecx는 증가, eax는 감소한다.


위의 연산 후 "sean"에 해당하는 키 값은 97FED5E0이다.


풀이


문제에서 Name은 한자리인데, 알파벳(대문자 소문자), 숫자 3가지 중에 하나라고 했고,
해당 Name의 키 값은 BEDA-2F56-BC4F4368-8A71-870B 라고 했다.

그렇다면 Name 값을 숫자, 알파벳 대문자, 소문자 순으로 입력했을 때 출력되는 key 값에 BEDA가 속해있는 것을 찾으면 된다.

#include <stdio.h>
#include <math.h>

int main(void)
{
	unsigned int esi = 0;
	
	for (int i = 0x30; i <= 0x7A; i++)
	{
		// 알고리즘
		esi = i * 0x772;
		esi = ((pow(esi, 2) + esi) * 0x474) * 2;

		// 일치한 것 표시
		unsigned short *pesi = (unsigned short*)&esi;

		if(*(++pesi) == 0xBEDA)
		{
			printf("%c -> %X correct!!\n", i, esi);
			continue;
		}

		printf("%c -> %X\n", i, esi);
	}

	return 0;
}


대문자 F가 문제에서 요구하는 Key 값일 때의 Name 값이라고 나왔다.


디버거에서 45BB24 주소의 명령어를 cmp eax, 3에서 cmp eax, 1로 수정 후 패치된 내용을 저장한 뒤 패치된 파일을 실행한다.


Name : F
Key : BEDA-2F56-BC4F4368-8A71-870B


정답 인증


https://www.convertstring.com/ko/Hash/MD5

위의 사이트에 접속해 F를 MD5로 해시화 하면 800618943025315F869E4E1F09471012라는 값이 나온다.


https://ch.codeengn.com/auth

위의 URL에 접속하여 Key 부분에 800618943025315F869E4E1F09471012를 입력하면 인증 완료된다.

반응형

'전쟁 > codeengn' 카테고리의 다른 글

[codeengn] Basic RCE 19  (1) 2022.10.14
[codeengn] Basic RCE 18  (0) 2022.10.14
[codeengn] Basic RCE 16  (0) 2022.07.31
[codeengn] Basic RCE 15  (0) 2022.07.30
[codeengn] Basic RCE 14  (0) 2022.07.30

+ Recent posts