2016-03-20 41 views
1

我是一名汇编程序初学者。我浏览了一个验证通过命令行输入的密码的文件。其中一个部分是下面的部分。我不明白movs拷贝到eax寄存器的事情。我也在使用evans调试器。对发生的事情有一个总体的了解会有所帮助。这个dissasembly是什么意思?

<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开始,或另一种更高级的语言)。