0. 메타데이터 분석
- PE64
- C언어로 작성된 프로그램
- 아마 패킹 안됐을 것이다
1. 동적 분석
Input을 사용자의 stdio를 통해 받는데 그게 콘솔에 이루어지는 입력
2. 정적 분석
sub_140001210은 사용자 입력을 받는 함수겠지
scanf계열일 것이고 stdin을 입력파일로 하니까
사용자 입력은 char로 들어가겠군!
그리고 들어가 보면 _acrt_iob_func(0)
이 보이므로 맞는 추측
중요한 건 검증 루틴인 sub_140001000() 이므로 delve into 해보자
2.1. sub_140001000(usr_input)
안예뻐
예쁘게 바꿔옴 ㅎㅎ
저 두 개의 바이트 배열의 관계를 보면
byte_140003000의 초반 0x12개 원소를 기준으로 byte_1400003020을 보는 거고
검증의 횟수는 총 0x12번 즉 18번이다.
그럼 byte_140003000에서는 어느 레인지까지의 답이 나오나 보자
근데 저거 아무래도 그건가? 암호원리 중 전치?
byte_140003000 데이터 분석
00 4D 51 50 EF FB C3 CF 92 45 4D CF F5 04 40 50 43 63
byte_140003020 데이터 분석
63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76 CA 82 C9 7D FA 59 47 F0 AD D4 A2 AF 9C A4 72 C0 B7 FD 93 26 36 3F F7 CC 34 A5 E5 F1 71 D8 31 15 04 C7 23 C3 18 96 05 9A 07 12 80 E2 EB 27 B2 75 09 83 2C 1A 1B 6E 5A A0 52 3B D6 B3 29 E3 2F 84 53 D1 00 ED 20 FC B1 5B 6A CB BE 39 4A 4C 58 CF D0 EF AA FB 43 4D 33 85 45 F9 02 7F 50 3C 9F A8 51 A3 40 8F 92 9D 38 F5 BC B6 DA 21 10 FF F3 D2 CD 0C 13 EC 5F 97 44 17 C4 A7 7E 3D 64 5D 19 73 60 81 4F DC 22 2A 90 88 46 EE B8 14 DE 5E 0B DB E0 32 3A 0A 49 06 24 5C C2 D3 AC 62 91 95 E4 79 E7 C8 37 6D 8D D5 4E A9 6C 56 F4 EA 65 7A AE 08 BA 78 25 2E 1C A6 B4 C6 E8 DD 74 1F 4B BD 8B 8A 70 3E B5 66 48 03 F6 0E 61 35 57 B9 86 C1 1D 9E E1 F8 98 11 69 D9 8E 94 9B 1E 87 E9 CE 55 28 DF 8C A1 89 0D BF E6 42 68 41 99 2D 0F B0 54 BB 16
간단한 해결책
byte_140003000 인덱스 0부터 끝까지 하나씩 돌림
byte_140003020 내부에서 byte_140003000[i] 가 존재한다면 해당 인덱스는 뭔지 저장
코딩 ㄱ
tmp='00 4D 51 50 EF FB C3 CF 92 45 4D CF F5 04 40 50 43 63'byte_140003000_str=tmp.split(' ')
byte_140003000= [int(i, 16) for i in byte_140003000_str]
tmp='63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76 CA 82 C9 7D FA 59 47 F0 AD D4 A2 AF 9C A4 72 C0 B7 FD 93 26 36 3F F7 CC 34 A5 E5 F1 71 D8 31 15 04 C7 23 C3 18 96 05 9A 07 12 80 E2 EB 27 B2 75 09 83 2C 1A 1B 6E 5A A0 52 3B D6 B3 29 E3 2F 84 53 D1 00 ED 20 FC B1 5B 6A CB BE 39 4A 4C 58 CF D0 EF AA FB 43 4D 33 85 45 F9 02 7F 50 3C 9F A8 51 A3 40 8F 92 9D 38 F5 BC B6 DA 21 10 FF F3 D2 CD 0C 13 EC 5F 97 44 17 C4 A7 7E 3D 64 5D 19 73 60 81 4F DC 22 2A 90 88 46 EE B8 14 DE 5E 0B DB E0 32 3A 0A 49 06 24 5C C2 D3 AC 62 91 95 E4 79 E7 C8 37 6D 8D D5 4E A9 6C 56 F4 EA 65 7A AE 08 BA 78 25 2E 1C A6 B4 C6 E8 DD 74 1F 4B BD 8B 8A 70 3E B5 66 48 03 F6 0E 61 35 57 B9 86 C1 1D 9E E1 F8 98 11 69 D9 8E 94 9B 1E 87 E9 CE 55 28 DF 8C A1 89 0D BF E6 42 68 41 99 2D 0F B0 54 BB 16'byte_140003020_str=tmp.split(' ')
byte_140003020 = [int(i, 16) for i in byte_140003020_str]
index_list = [byte_140003020.index(i) for i in byte_140003000 if i in byte_140003020]
index_str = [chr(i) for i in index_list]
output=[]
output.append(''.join(index_str))
print(output)
결과