블로그 이미지
ludwings

카테고리

분류 전체보기 (130)
WIN API (22)
워게임 (61)
만든것 (2)
메모 (37)
Total18,086
Today0
Yesterday3

canyouhack.it crack 3번 점수가 제일 높다.. 어렵겠지만 해봐야지

 

back to user mode로 값 인증하는 부분은 쉽게 찾을수 있다.

 

그리고 같은 함수를 3번 호출하며 입력한 9 개의 값을 연산하여

 

또 이 9개의 값으로 미리 만들어놓은 값이랑 비교하는데

 

여기서 얻을수 있는 힌트는

 

1. 연산한 결과는 모두 같기 때문에 9개의 값으로 미리 만들어 놓은 값들도 모두 일치 해야한다.

 

 

 

 

앞에 어셈블리는 이런식으로 되어있는데

(n1, n2, n3 /.... 들은 입력한 값을 10으로 나눈 나머지를 이용하여 나온 값들이다)

여기서 차이점은 연산하는 과정에서 n1을 사용하냐 n2 , n6이냐 이다.

 

즉 n1, n2, n3 의 값이 같으면 미리 저장해두는 3개의 값은 모두 같을 것이다.

 

 

2. 9개의 값으로 새로운 숫자를 만드는 함수 부분을 정리하면

 

1*5*9+4*8*3+2*7*6 - (3*5*7+6*8*1+9*2*4)

이다.  (1번째 5번째... 숫자 x)

 

이 결과와 10으로 나눈 나머지를 이용해 만든 값과 일치해야한다...

 

또 나머지를 이용하여 값을 만들때 4번째와 8번째 입력값은 사용되지 않는데,

이것이 문제를 풀때 유용할것같다.

 

 

10으로 나눈 나머지들 연산해서 구하는 값은

10000 * n5 + 1000 * n1 + 100 * n3 + 10 * n9 + n7 + 2

   + 1000 * n2

   + 1000 * n6

 

이거다.

 

이거 일치하면 cell안에 있는 값들을 그냥 출력해주는걸보니까 셀안에 들어갈 값들은 영어로된 애들같다.. 아스키코드를 넣어보자

 

 

 

#include 
#include 
#include 

int main()
{
	int n[11] = {0, };
	int result[3] = {0, };

	/*
	n1		9까지
	n2		12까지
	n3		14까지
	n5		9까지
	n6		9까지
	n7		9까지
	n9		9까지
	
	4, 8 은? 안쓰나?

	연산과정
	eax = n7
	eax +2

	ecx = n5
	ecx = ecx*10
	ecx += n1
	ecx *10
	ecx +n5
	ecx *10
	ecx +n9
	ecx *10

	ecx + eax

	//////////////////////////////////////////////////////////////////////////
	int eax, edx;
	eax = n[7];
	eax += 2;

	edx = n[5];
	edx = edx + edx;
	edx = edx + edx*4;

	edx = edx + n[1];
	edx = edx + edx;
	edx = edx + edx*4;

	edx = edx + n[3];
	edx = edx + edx;
	edx = edx + edx*4;

	edx = edx + n[9];
	edx = edx + edx;
	edx = edx + edx * 4;

	edx = edx + eax; // EBP - 18 이 이거야.
	result[0] = edx;

	/////////////////////////////////////////////////////
	edx = n[5];
	edx = edx + edx;
	edx = edx + edx * 4;


	edx = edx + n[6];
	edx = edx + edx;
	edx = edx + edx * 4;

	edx = edx + n[3];
	edx = edx + edx;
	edx = edx + edx * 4;

	edx = edx + n[9];
	edx = edx + edx;
	edx = edx + edx * 4;

	edx = edx + eax;// 이게 EBP-1C
	result[1] = edx;

	////////////////////////////////////////////////////
	int ecx = n[5];
	ecx = ecx + ecx;
	ecx = ecx + ecx * 4;

	ecx = ecx + n[2];
	edx = ecx;
	edx = edx + edx;
	edx = edx + edx * 4;

	edx = edx + n[3];
	ecx = edx;
	ecx = ecx + ecx;
	ecx = ecx + ecx * 4;

	ecx = ecx + n[9];
	edx = ecx;
	edx = edx + edx;
	edx = edx + edx * 4;

	eax = eax + edx;/// 이게 EBP 그거
	result[2] = eax;

	
	*/
	for(int n1 = 'a' ; n1 <= 'z' ; n1 ++)
	{
		for(int n2 = 'a' ; n2 <= 'z'; n2 ++)
		{
			if(n1%10 != n2%10+3)
			{
				continue;
			}
			for(int n3 = 'a' ; n3 <= 'z' ; n3 ++)
			{
				for(int n4 = 'a' ; n4 <= 'z' ; n4 ++)
				{
					for(int n5 = 'a' ; n5 <= 'z' ; n5 ++)
					{

					//	for(int n6 = 'a' ; n6 <= 'z' ; n6 ++)
					//	{
							int n6 = n1;
							for(int n7 = 'a' ; n7 <= 'z' ; n7 ++)
							{
								for(int n8 = 'a' ; n8 <= 'z' ; n8++)
								{

									for(int n9 = 'a' ; n9 <= 'z' ; n9 ++)
									{
										n[1] = n1%10;
										n[2] = n2%10+3;
										n[3] = n3/10%10+5;
										n[4] = n4%10;
										n[5] = n5%10;
										n[6] = n6%10;
										n[7] = n7%10;
										n[8] = n8%10;
										n[9] = n9/10%10;

										int result = 10000*n[5]+1000*n[1]+100*n[3]+10*n[9]+n[7]+2;
										int result2 =  (n1*n5*n9+n4*n8*n3+n2*n7*n6) - (n3*n5*n7+n6*n8*n1+n9*n2*n4);
										if( result == result2)
										{
											printf("%c%c%c%c%c%c%c%c%c\n%d %d %d %d %d %d %d %d %d\n", n1,n2,n3,n4,n5,n6,n7,n8,n9, n1,n2,n3,n4,n5,n6,n7,n8,n9);
										}

										/*
										if( result[0]==result[1] && result[1] == result[2])
										{

											for(int i = 0 ; i < 10 ; i ++)
											{
												printf("n[%d] = %d\n", i+1, n[i+1]);
											}

											getchar();
										}
										*/
									}
								}
							}
					//	}
					}
				}
			}
		}
	}

	return 0;
}
이렇게해서 얻은값을 cell에 넣어보니까 정답이라고뜨는데 값이너무많아;; 계속나와 인증해도 ㅇ정답이아니야 뭐지?
Posted by ludwings

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함