(如果BYTE PTR [ebp + 0x8]获得大于1个字节的参数会怎样?例如0xcdc485c1

问题描述 投票:0回答:1

所以...我有这个test.S文件,他在那里获得以下参数:asm3(0xcdc485c1,0xd6bd5e88,0xe4c1548d)

代码:

```asm3:
      <+0>:   push   ebp
      <+1>:   mov    ebp,esp
      <+3>:   xor    eax,eax
      <+5>:   mov    ah,BYTE PTR [ebp+0x8]
      <+8>:   shl    ax,0x10
      <+12>:  sub    al,BYTE PTR [ebp+0xe]
      <+15>:  add    ah,BYTE PTR [ebp+0xc]
      <+18>:  xor    ax,WORD PTR [ebp+0x10]
      <+22>:  nop
      <+23>:  pop    ebp
      <+24>:  ret```

我想知道例如0xcdc485c1(ebp + 0x8)会发生什么,因为它有1个以上的字节吗?它只会得到有效字节吗?否则将整个存储,如果是,为什么?而且,如果您也知道,那么“ ebp + 0xe”在哪里,它不是参数表吗?

assembly reverse-engineering
1个回答
0
投票

在函数的<+3>处,堆栈如下所示:

               0  1  2  3   byte offsets
     + 0x10 | 8d 54 c1 e4 |
     + 0x0c | 88 5e bd d6 |
     + 0x08 | c1 85 dc cd |
     + 0x04 | return      |
 ebp + 0x00 | prev. ebp   |

堆栈上有五个DWORD(32位值),每个DWORD的顺序为小端顺序。

无论出于何种原因,下面的代码都只从堆栈中选择了几个字节,并选择了一个WORD(16位),因此它使用了三个DWORD参数的一部分。

FWIW:shl ax, 0x10看起来像是将ax设置为零的漫长方式。

© www.soinside.com 2019 - 2024. All rights reserved.