블로그 이미지
ludwings

카테고리

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

'3'에 해당되는 글 3건

  1. 2013.11.01 [ Canyouhack.it ] Crack 3 - 9 Cells, 1 Prison
  2. 2013.10.31 thisislegal.com application 1,2,3
  3. 2013.10.21 codeengn : basic 03 (2)

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

댓글을 달아 주세요

thisislegal 리버싱문제를 풀었다.

 

4번은 무슨 16bit dos 디버거로 해결하는거여서 내비려뒀다

 

1번 그냥 쉽다

올리디버거로 붙인후에, 성공 출력하는 곳으로 가보면

바로위에 어떤 '위치' 에서 실행되면 출력되는것을 확인할수있다.

이걸 위치를 안옮겨주고 그냥 파일을 패치해버리면 정답이 제대로 출력되지 않는다.

 

2번 클릭하면댐!

마우스올리면 disable로 바뀌어버리는 귀요미문제 ㅋㅋㅋㅋ 클릭하라고해놓고는..

이것도 올디로 열어서 mousemove 부분을 그냥 click event 부분으로 점프하게 해버렷더니 답이 쉽게 나왔다. (vb decompiler 도움도 받았다)

 

3번 이것도 1번처럼 성공메세지가서 위의 string을 비교하는 부분을 step into 하면서

stack을 잘보니 내가 입력한 문자열 "1234"와 key값 "어쩌고저쩌고" 가 같이 나와서 풀었당

'워게임 > 리버스엔지니어링' 카테고리의 다른 글

codeengn advance rce l10 풀이  (0) 2013.11.21
섹션 합치기 & 섹션 추가  (2) 2013.10.31
thisislegal.com application 1,2,3  (0) 2013.10.31
B1ind3r Reversing 2, 3  (2) 2013.10.24
canyouhack.it crack 1, 2  (0) 2013.10.23
codeengn : basic 03  (2) 2013.10.21
Posted by ludwings

댓글을 달아 주세요

그냥 peid 도 안대고 문자열도 안뽑히고 pe view도 안돼서 그냥 노트패트에 넣어봤더니.. 그냥 막 문자열들 있고 의심가는 애 있어서 그냥 정답에 넣어 보니까 정답..

'워게임 > 리버스엔지니어링' 카테고리의 다른 글

B1ind3r Reversing 2, 3  (2) 2013.10.24
canyouhack.it crack 1, 2  (0) 2013.10.23
codeengn : basic 03  (2) 2013.10.21
WINDBG 명령어 정리  (0) 2013.10.15
CodeInjection  (0) 2013.10.15
IAT 후킹..계산기  (0) 2013.10.14
Posted by ludwings
TAG 3, Codeengn, 풀이

댓글을 달아 주세요

  1. 2013.10.22 21:32  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

최근에 달린 댓글

최근에 받은 트랙백

글 보관함