ReversingKr KeygenMe
Find the Name when the Serial is 5B134977135E7D13
실행해주면 name과 serial을 비교하여 주는데
금방 닫혀버려서 결과가 어떤지도 알기 힘듭니다.
IDA로 디컴파일하면 다음과 같습니다.
int __cdecl main(int argc, const char **argv, const char **envp)
{
signed int v3; // ebp
int i; // esi
char v6; // [esp+Ch] [ebp-130h]
char v7[2]; // [esp+Dh] [ebp-12Fh] BYREF
char v8[100]; // [esp+10h] [ebp-12Ch] BYREF
char Buffer[197]; // [esp+74h] [ebp-C8h] BYREF
__int16 v10; // [esp+139h] [ebp-3h]
char v11; // [esp+13Bh] [ebp-1h]
memset(v8, 0, sizeof(v8));
memset(Buffer, 0, sizeof(Buffer));
v10 = 0;
v11 = 0;
v6 = 0x10;
qmemcpy(v7, " 0", sizeof(v7));
sub_4011B9(aInputName);
scanf("%s", v8);
v3 = 0;
for ( i = 0; v3 < (int)strlen(v8); ++i )
{
if ( i >= 3 )
i = 0;
sprintf(Buffer, "%s%02X", Buffer, v8[v3++] ^ v7[i - 1]);
}
memset(v8, 0, sizeof(v8));
sub_4011B9(aInputSerial);
scanf("%s", v8);
if ( !strcmp(v8, Buffer) )
sub_4011B9(aCorrect);
else
sub_4011B9(aWrong);
return 0;
}
sprintf의 결과를 확인하기 위해 디버깅을해보면 다음과 같이 나옵니다.
입력한 값을 v7[-1](V6), v7[0], v7[1]와 XOR 연산하는 순환 구조입니다.
각각의 값은 0x10, 0x20, 0x30입니다.
"%s%02X" 형식으로 나오는 것으로 되어 있는데
XOR연산한 hex값을 ascii로 변환시켜줍니다.
따라서 주어졌던 시리얼 값인 5B134977135E7D13을
2문자씩 쪼개서 0x10, 0x20, 0x30 순으로 xor 연산 해주면 됩니다.
num = '5B 13 49 77 13 5E 7D 13'
num_li = num.split()
xor_li = [0x10, 0x20, 0x30]
i = 0
for n in num_li:
if i>=3 :
i=0
print(chr(int(n,16)^xor_li[i]),end='')
i += 1
K3yg3nm3
'write-up(rev) > reversing.kr' 카테고리의 다른 글
[reversing.kr] Replace write-up (0) | 2024.06.01 |
---|---|
[reversing.kr] Music Player write-up (0) | 2024.05.31 |
[reversing.kr] Easy ELF write-up (0) | 2023.08.30 |
[reversing.kr] Easy Unpack write-up (0) | 2023.08.30 |
[reversing.kr] Easy Crack write-up (0) | 2023.08.18 |