SuperVingo

CodeEngn.com Basic RCE L20 WriteUp 본문

Wargame[워게임]/CodeEngn

CodeEngn.com Basic RCE L20 WriteUp

SuperVingo 2020. 8. 4. 21:59
728x90

마지막 문제답게 어려워보인다. 한번 도전해보자.

 

0. 실행화면

뭐 없다...

 

1. ExeInfoPE 분석

다행히 패킹은 되어있지 않으므로 분석을 바로 들어간다.

 

2. 올리디버거 분석

처음 ReadFile을 통해서 파일을 읽어온다. 그 후, 글자수가 0x12, 즉 18자인지 비교하므로 키파일의 크기는 18바이트여야한다. 그 후 함수와 비교를 통해 성공 문자열을 출력한다. 그럼 첫번째 Routine에 들어가보자.

EAX, ECX를 0으로 초기화한 후, BL을 0x41 ~ 0x4F까지 총 14번 반복한다. 그 사이에서 KEY에서 한자리씩 가져와 BL과 XOR연산을 진행한 후, 0x4020F9에 누적하고 있다.

그 후, 0x4020F9와 0x12345678를 XOR연산을 진행한 후, 0040133으로 넘어간다. 저 함수에서는 키 마지막 4자리를 가져와 EAX에 저장한다.

그 후, EAX와 0x4020F9를 비교하여 제로 플래그가 0인지 아닌지 확인하여 분기한다.

 

XOR의 연산의 특징은 연산을 2번 진행하면 원래의 값이 나오게 된다. 즉,

 

A XOR B = C일때, C XOR B = A라는 식이 성립하게 된다는 것이다.

그리고 위 REP 구문을 통해서 Cracked by: 뒤에 XOR 계산된 14바이트 글자가 들어가게 된다.

 

그럼 지금까지 과정을 정리하면 XOR된 CodeEngn을 앞 14바이트에 넣어주고, 누적된 값을 뒤 4바이트에 저장하면 된다.

#include <stdio.h>

int main(void)
{
	char key[] = "CodeEngn";
	int bl, i;
	
	for(bl = 0x41, i = 0; bl <= 0x4F; bl++, i++)
	{
		key[i] ^= bl;
		printf("%02x ", key[i]);
	}
	return 0;
}

위 코드를 통해서 XOR된 Hex데이터를 HxD를 통해 넣어줬다. 

그 후 다시 실행을 해보면,

0x004020F9에 값이 있고, 이 값을 뒤 4바이트에 넣어주면

성공 문자열을 볼 수있었다.

728x90