Como iniciante em Assembly, tenho praticado desmontagem e engenharia reversa em assembly Intel x86 no IDA.
O programa atual que estou tentando descobrir valida a senha fornecida pelo usuário formando sua própria "senha de validação" e comparando as duas. Se elas corresponderem, a senha fornecida pelo usuário é aceita.
A senha de validação é formada por um loop que é executado 16 vezes e os caracteres para a senha vêm de um rótulo chamado CHARACTERS
que armazena o endereço da string aAbcdefghijklmn
.
aAbcdefghijklmn
é definido como'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
var_40
é definido como -40
hexadecimal.
mov [ebp+loop_counter], 0
loc_8049201:
cmp [ebp+loop_counter], 0Fh ; Compare Two Operands
jge loc_804922F ; Jump if Greater or Equal (SF=OF)
mov eax, CHARACTERS
mov ecx, [ebp+loop_counter]
mov ecx, [ebp+ecx*4+var_40]
mov dl, [eax+ecx]
mov eax, [ebp+loop_counter]
mov [ebp+eax+validation_password], dl
mov eax, [ebp+loop_counter]
add eax, 1 ; Add
mov [ebp+loop_counter], eax
jmp loc_8049201 ; Jump
loc_804922F:
lea eax, [ebp+validation_password] ; Load Effective Address
mov ecx, [ebp+user_password]
mov edx, esp
mov [edx+4], ecx
mov [edx], eax
call _strcmp ; Call Procedure
cmp eax, 0 ; Compare Two Operands
jnz loc_804925D ; Jump if Not Zero (ZF=0)
Esta parte cria a senha de validação.
mov eax, CHARACTERS
mov ecx, [ebp+loop_counter]
mov ecx, [ebp+ecx*4+var_40]
mov dl, [eax+ecx]
mov eax, [ebp+loop_counter]
mov [ebp+eax+validation_password], dl
mov eax, [ebp+loop_counter]
add eax, 1 ; Add
mov [ebp+loop_counter], eax
jmp loc_8049201 ; Jump
O que não consigo entender é como o índice da 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
string para cada loop é calculado.
O que eu entendo é que o caractere escolhido é o endereço de CHARACTERS
armazenado em eax
e o valor de [ebp+ecx*4+var_40]
como o offset, criando o índice específico. Isso é então armazenado em dl
.
Não sei como determinar o número do índice usando o cálculo do endereço de memória [ebp+ecx*4+var_40]
em cada loop.
EDITAR:
A inicialização do array ebp+var_40
é feita com _memcpy anteriormente na mesma função.
push ebp
mov ebp, esp
push esi
sub esp, 64h
mov eax, [ebp+user_password]
xor ecx, ecx
lea edx, unk_804A064 ; db 3
lea esi, [ebp+var_40]
mov [esp], esi
mov [esp+4], edx
mov dword ptr [esp+8], 3Ch
mov [ebp+var_58], eax
mov [ebp+var_5C], ecx
call _memcpy
unk_804A064
é definido como db 3
. A partir unk_804A064
dos 60 bytes seguintes estão:
3, 0, 0, 0, 34h, 0, 0, 0, 38h, 0, 0, 0, 1Ah, 0, 0, 0, 2Ch, 0, 0, 0, 2Ch, 0, 0, 0, 1Eh, 0, 0, 0, 26h, 0, 0, 0, 1Bh, 0, 0, 0, 25h, 0, 0, 0, 32h, 0, 0, 0, 13h, 0, 0, 0, 37h, 0, 0, 0, 2Ch, 0, 0, 0, 0Ah, 0, 0, 0