본문으로 바로가기

[Reversing] encrypt / 250

category ICEWALL 2019. 7. 21. 18:54

Download: encrypt

 

64bit ELF 파일이다. IDA로 분석해 본다.

 

password를 입력받고, check 함수가 checking-password라고, 아마 password가 적절한지 확인하는 함수라고 예상해 볼 수 있다. 그렇다면 check 함수를 분석해야 할 텐데, 확인해보면 디컴파일이 불가능하고 알 수 없는 instruction이 가득하다.

 

다시 main으로 돌아가서, 이 함수가 암호화되었다고 언급하는 부분을 볼 수 있다. 그렇다면 복호화를 해야 하는데, decrypt라는 함수가 정의되어 있는 것을 볼 수 있고, 내부는 다음과 같다.

 

전체 a2 바이트에 대하여, 각 바이트에 16을 더하고 10을 xor 연산하는 것을 확인할 수 있다. check 함수 영역의 바이트를 전부 decrypt 해 준 뒤에 패치하면 될 것이다. (0x4006EB ~ 0x400810) 변환은 간단한 코딩으로 구현할 수 있고 적용은 HxD 등의 hex editor를 이용하면 된다.

 

/* BYTES : Source
4F 32 73 DF 32
79 D6 0A BD 3F E2 FA FA FA FA BD 3F E6 FA FA FA
FA BD 3F E2 FA FA FA FA D1 FE 79 3F E2 FB 71 3F
E2 32 82 F5 AC 7A 7A 0A 5A FA 7E BA 6E D6 79 67
E2 18 F5 7E C1 FA FA FA F5 AC FF 4B F3 1A FA 26
3B 6F 4E F5 AC FF 3D F3 1A FA 26 1C 6F 33 F5 AC
FF 27 F3 1A FA 26 29 6F 24 F5 AC FF 29 F3 1A FA
26 59 6F 29 F5 AC FF 13 F3 1A FA 26 10 6F 12 F5
AC FF 05 F3 1A FA 26 57 6F 07 F5 AC FF 0F F3 1A
FA 26 1F 6F 08 F5 AC FF F1 F3 1A FA 26 19 6F FD
BD 3F E6 FB FA FA FA 79 67 E6 FB 6F 6C A2 72 0A
5A FA 71 FA 27 4E 52 5F 68 6F 52 A2 76 0A 5A FA
71 FA 27 5F 45 5B 68 6F 40 A2 8A 0A 5A FA 71 FA
27 5F 45 57 5B 6F 36 A2 8E 0A 5A FA 71 FA 27 54
63 45 52 6F 24 A2 82 0A 5A FA 71 FA 27 5F 62 45
5F 6F 2A A2 86 0A 5A FA 71 FA 27 5E 53 6E 55 6F
18 A2 9A 0A 5A FA 71 FA 27 68 69 FA FA 6F 0E A2
FA FA FA FA D2 CE E4 E5 E5 A5 FA FA FA FA D2 37
E7 E5 E5 A5 F2 F3 3A FA D2 E9 E6 E5 E5 8A B3 B9

 * BYTES: Decrypted
55 48 89 E5 48
83 EC 10 C7 45 F8 00 00 00 00 C7 45 FC 00 00 00
00 C7 45 F8 00 00 00 00 EB 04 83 45 F8 01 8B 45
F8 48 98 0F B6 80 80 10 60 00 84 C0 74 EC 83 7D
F8 22 0F 84 DB 00 00 00 0F B6 05 51 09 20 00 3C
41 75 54 0F B6 05 47 09 20 00 3C 26 75 49 0F B6
05 3D 09 20 00 3C 33 75 3E 0F B6 05 33 09 20 00
3C 63 75 33 0F B6 05 29 09 20 00 3C 2A 75 28 0F
B6 05 1F 09 20 00 3C 6D 75 1D 0F B6 05 15 09 20
00 3C 25 75 12 0F B6 05 0B 09 20 00 3C 23 75 07
C7 45 FC 01 00 00 00 83 7D FC 01 75 76 B8 88 10
60 00 8B 00 3D 54 68 65 72 75 68 B8 8C 10 60 00
8B 00 3D 65 5F 61 72 75 5A B8 90 10 60 00 8B 00
3D 65 5F 6D 61 75 4C B8 94 10 60 00 8B 00 3D 6E
79 5F 68 75 3E B8 98 10 60 00 8B 00 3D 65 78 5F
65 75 30 B8 9C 10 60 00 8B 00 3D 64 69 74 6F 75
22 B8 A0 10 60 00 8B 00 3D 72 73 00 00 75 14 B8
00 00 00 00 E8 D4 FE FF FF BF 00 00 00 00 E8 4D
FD FF FF BF 08 09 40 00 E8 F3 FC FF FF 90 C9 C3
*/

#include <cstdio>

int main() {
	FILE *in = fopen("input.txt", "r");
	FILE *out = fopen("output.txt", "w");

	for (int i=0 ; ; i++) {
		int t;

		if (fscanf(in, "%x", &t) == -1) break;
		
		unsigned __int8 b = (unsigned __int8)t;
		b += 16;
		b ^= 10;

		fprintf(out, "%02X", b);

		if (i==4 || (i>16 && i%16==4)) fprintf(out, "\n");
		else fprintf(out, " ");
	}
	
	fclose(in);
	fclose(out);

	return 0;
}

다시 IDA로 돌아와서 확인하면 정상적인 코드가 된 것을 확인할 수 있다.

 

printflag 함수는 0x601088 위치의 문자열을 출력하므로, 저걸 직접 다 맞춰줘서 바이너리를 실행해 넣어줄 필요는 없고 0x601088부터 0x6010A0에 들어가는 값들을 문자로 바꿔주면 된다. 결과는 There_are_many_hex_editors 이고, 바이너리를 실행해서 확인해도 정답임을 알 수 있다.

 

'ICEWALL' 카테고리의 다른 글

[Forensic] image / 50  (0) 2019.07.22
[Reversing] antidbg / 350  (0) 2019.07.21
[Reversing] login / 200  (0) 2019.07.21
[Reversing] noteasy / 170  (0) 2019.07.21
[Reversing] easy / 150  (0) 2019.07.20