2016-03-20 4 views
1

Я новичок в ассемблере. Я выполнил файл, который проверяет пароль, введенный через командную строку. Один из его разделов был ниже. Я не понимаю, что копирует movs в регистр eax. Я также использую отладчик evans. Помогло бы общее понимание происходящего.Что означает эта разборка?

<fillpassword>: 
804851d: 55      push ebp 
804851e: 89 e5     mov ebp,esp 
8048520: 8b 45 08    mov eax,DWORD PTR [ebp+0x8] 
8048523: c6 00 53    mov BYTE PTR [eax],0x53 
8048526: 8b 45 08    mov eax,DWORD PTR [ebp+0x8] 
8048529: 83 c0 01    add eax,0x1 
804852c: c6 00 30    mov BYTE PTR [eax],0x30 
804852f: 8b 45 08    mov eax,DWORD PTR [ebp+0x8] 
8048532: 83 c0 02    add eax,0x2 
8048535: c6 00 52    mov BYTE PTR [eax],0x52 
8048538: 8b 45 08    mov eax,DWORD PTR [ebp+0x8] 
804853b: 83 c0 03    add eax,0x3 
804853e: c6 00 50    mov BYTE PTR [eax],0x50 
8048541: 8b 45 08    mov eax,DWORD PTR [ebp+0x8] 
8048544: 83 c0 04    add eax,0x4 
8048547: c6 00 52    mov BYTE PTR [eax],0x52 
804854a: 8b 45 08    mov eax,DWORD PTR [ebp+0x8] 
804854d: 83 c0 05    add eax,0x5 
8048550: c6 00 33    mov BYTE PTR [eax],0x33 
8048553: 8b 45 08    mov eax,DWORD PTR [ebp+0x8] 
8048556: 83 c0 06    add eax,0x6 
8048559: c6 00 53    mov BYTE PTR [eax],0x53 
804855c: 8b 45 08    mov eax,DWORD PTR [ebp+0x8] 
804855f: 83 c0 07    add eax,0x7 
8048562: c6 00 34    mov BYTE PTR [eax],0x34 
8048565: 8b 45 08    mov eax,DWORD PTR [ebp+0x8] 
8048568: 83 c0 08    add eax,0x8 
804856b: c6 00 00    mov BYTE PTR [eax],0x0 
804856e: 5d      pop ebp 
804856f: c3      ret  

ответ

1

EBP + 0x8 выглядит как параметр вызова функции - адрес строки, на которую нужно писать. Код повторно загружает этот адрес в AX и увеличивает его, а затем записывает проводной символ в местоположение, на которое указывает AX, так что чистый результат заключается в том, чтобы сохранить строку «S0RPR3S4» (с разделителем 0) на адрес, переданный в EBP + 0x8.

В C, это будет выглядеть примерно так:

void fillpassword(char *p) 
{ 
    p[0] = 'S'; 
    p[1] = '0'; 
    p[2] = 'R'; 
    p[3] = 'P'; 
    p[4] = 'R'; 
    p[5] = '3'; 
    p[6] = 'S'; 
    p[7] = '4'; 
    p[8] = '\0'; 
} 

Это своего рода неэффективный способ выполнить свою задачу, и это выглядит, был скомпилирован без оптимизации (предполагая, что она начнется в C, или другой язык более высокого уровня).

Смежные вопросы