这是什么意思?
What does this dissasembly mean?
我是汇编初学者。我 objdump 了一个文件,用于验证通过命令行输入的密码。它的部分之一是下面的部分。我不明白 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
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] = '[=10=]';
}
这是一种低效的完成任务的方式,而且它看起来是在没有优化的情况下编译的(假设它确实是从 C 或其他更高级的语言开始的)。
我是汇编初学者。我 objdump 了一个文件,用于验证通过命令行输入的密码。它的部分之一是下面的部分。我不明白 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
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] = '[=10=]';
}
这是一种低效的完成任务的方式,而且它看起来是在没有优化的情况下编译的(假设它确实是从 C 或其他更高级的语言开始的)。