2017. 7. 28. 03:20ㆍ0x02 Reverse Engineer/0x02. Reversing.kr
반복되는 루틴 배열 찾고, 이름과 시리얼의 관계만 파악하면 된다.
Find the Name when the Serial is 5B134977135E7D13
시리얼 길이 16자리
네임 : aa일때
시리얼 : 7141 (4자리)
1)
0040107E |> \0FBE4C34 0C |movsx ecx,byte ptr [esp+esi+0xC] ; 10 20 30 이 [esp+esi+0xc]에 들어감
00401083 |. 0FBE542C 10 |movsx edx,byte ptr [esp+ebp+0x10] ; 내가 입력한 네임이 들어감
00401088 |. 33CA |xor ecx,edx ; 입력한 한 값과 ^ 10 , 입력한 값과 ^ 20, ^ 30
2) 저 루틴 다 돌면 7141이 나오는데
네임 * 2 = 시리얼 값
3) 5B ^ 10 13 ^ 20 49 ^ 30 ??
4) a*8 (input)
[0] = 61 ^ 10 = 71
[1] = 61 ^ 20 = 41
[2] = 61 ^ 30 = 51 // 이까지 범위임
[3] = 61 ^ 10 = 71
5) 키젠 나왔네
-> 조건 : 이름은 4자리
시리얼 8자리 인데
시리얼을 만들 때 [0]은 10을 xor [1]은 20을 xor [2]는 30을 xor
[3]은 10을 xor
5B ^ 10 4b
13 ^ 20 33
49 ^ 30 79
77 ^ 10 67
13 ^ 20 33
5E ^ 30 2e
7D ^ 10 6d
13 ^ 20 33
4b337967336e6d33 === K3yg3nm3
#include <stdio.h>
#include <string.h>
int main(void)
{
int routine[3] = {0x10,0x20,0x30};
char name[9] ="\0";
char serial[9] = {0x5B,0x13,0x49,0x77,0x13,0x5E,0x7D,0x13};
int i=0;
int j=0;
printf("name length = %d\n",sizeof(name)-1);
printf("serial length = %d\n", sizeof(name)*2-2);
printf("Name = ");
for(i=0; i<8 ; i++)
{
if(j==3)
j=0;
name[i] = serial[i] ^ routine[j];
j++;
printf("%c",name[i]);
}
}
'0x02 Reverse Engineer > 0x02. Reversing.kr' 카테고리의 다른 글
CRC1 (0) | 2018.01.05 |
---|---|
PEpasswd (0) | 2017.12.01 |
RansomWare (0) | 2017.07.28 |
MusicPlayer (0) | 2017.07.28 |
EasyUnpackMe (0) | 2017.07.28 |