-->

[reversing.kr] HateIntel 풀이

ARM 파일인데 IDA 정적분석으로 충분히 풀 수 있는 문제이다. 분석 자체는 쉬운데 코드를 짤 때, 타입 선언이랑 초기화를 제대로 안해줘서 삽질을 했던 문제이다.

 

 

 

reversing.kr HateIntel 풀이

Wrong/Correct 문자열이 사용되는 함수로 가보면, 아래와 같이 v1에 key값을 입력받고 sub_232C를 호출한 후에 입력받은 key값 길이만큼 반복문을 돌며 연산 값을 byte_30040 배열과 비교하고 있다. 한바이트라도 같지 않으면 Wrong Key!가 뜨게 된다. 

 

 

 

byte_3004는 총 29바이트이기 때문에 입력 key값의 길이가 29바이트여야 한다는 것을 알 수 있다.

 

 

 

sub_232C를 살펴보면, 아래와 같이 반복문 내에서 입력 key값 한바이트씩 인자로 넘겨 sub_2494를 호출한다.

 

 

 

sub_2494는 |, &, *와 같은 간단한 연산을 수행한다.

 

 

 

사실 역연산을 구하는 방법이 코드가 더 간결할 것 같지만 머리가 돌아가지 않아 브루트포싱 방식으로 코드를 짰다. 아무래도 코드를 전체공개하면 정답을 공개하는 것과 마찬가지이므로 앞뒤를 잘랐다. 사실 근데 헥스레이 코드를 그대로 옮긴 것이고 sub_2494 정의와 byte_30040 선언 정도만 추가하면 되기 때문에 전체 코드나 다름없다.

 

다만 sub_2494 반환값 타입 지정과 sub_2494의 호출로 0x0에서 0xff까지 반복되는 변수값이 변하기 때문에 반복문 첫부분에서 다른 변수로 백업을 해야하는 점만 주의하면 될 것 같다. (나만 삽질한 걸수도......)

 

// ...

	for (int k = 0; k < 29; k++)
	{
		//printf("%d\n", k);
		for (int val = 0x0; val < 0xff; val++)
		{
			tmp = val;
			for (int i = 0; i < 4; i++)
			{
				j = 0;
				while (1)
				{
					if (j >= 29) break;
					tmp = sub_2494(tmp);
					j++;
				}
			}
			if (tmp == byte_3004[k]) printf("%c", val);
		}
	}
    
// ...

 

 

코드를 돌리면 다음과 같이 key 값을 얻을 수 있다 :)

 

 

'리버싱 > reversing.kr' 카테고리의 다른 글

[reversing.kr] PEPassword 풀이  (0) 2020.03.19
[reversing.kr] CSHOP 풀이  (0) 2020.03.19
[reversing.kr] AutoHotkey1 풀이  (2) 2020.03.17
[reversing.kr] WindowsKernel 풀이  (0) 2020.03.15
[reversing.kr] Easy ELF 풀이  (0) 2020.03.15

댓글

Designed by JB FACTORY