Wargame[워게임]/CodeEngn

CodeEngn.com Basic RCE L01 WriteUp

SuperVingo 2020. 7. 27. 17:42
728x90

 

1. 실행화면

처음 실행화면

 

확인 버튼 클릭 시, 화면

 

2. ExeInfoPE 분석

ExeinfoPE

크게 얻을 수 있는 정보는 없다.

 

3-1. 올리디버거 분석

쉽게 분석할 수 있는 수준이다.
기본적인 흐름

GetDriveTypeA의 리턴값 이후, 연산을 진행하여 분기됨.

GetDriveTypeA Return Value

HDD는 DRIVE_FIXED, 즉 3이 리턴값이고, CD-ROM의 경우에는 DRIVE_CDROM, 즉 5가 리턴된다.

EAX(GetDriveTypeA의 return value)는 -2, ESI는 +3 후, 비교하여 분기를 진행한다.

 

3-2. Ghidra 분석

Ghidra를 통해 실행하면 

디컴파일된 코드를 볼 수 있었다.

위 올리 디버거와 같이 GetDriveTypeA의 Return value에 -2, ESI에 +3 연산 후, 비교하여 분기된다.

GetDriveTypeA에 DAT_00402094가 인자로 들어갔고, 이는 c:\인것을 알 수 있었다.

 

4. 소스코드

#include <windows.h>

int main(void)
{
	unsigned int result;
	int ESI;
	
	MessageBox(NULL, "Make me think your HD is a CD-ROM.", "abex' 1st crackme", 0);
	result = GetDriveTypeA("c:\\");
	if(result - 2 == ESI + 3)
		MessageBox(NULL, "Ok, I really think that your HD is a CD-ROM!", "Yeah!", 0);
	else
		MessageBox(NULL, "Nah... This is not a CD-ROM Drive!", "Error", 0);
	return 0;
}

 

A. 이번 문제를 풀면서 초기화에 대한 중요성을 알았다. 이번 문제에 ESI를 초기화하는 코드가 보이지 않았고, 그에 따라 컴파일러에 따른 차이가 예상된다. 본인의 경우에는 ESI 초기화가 진행되지 않아 ESI에는 Entry Point가 들어 있었다.

이에 따라서 원래는 EAX - 2 == ESI + 3에서 EAX = 5, ESI = 0으로 계산하여 3 == 3으로 인해 참이 되어야하는데, EAX = 5, ESI = 0x401000이 들어있어 3 != 0x401003으로 계산되어 진입이 불가능했다.

728x90