Car*_*on 7 x86 assembly reverse-engineering ida
我最近一直在学习汇编,并决定反汇编一些我自己的可执行文件来学习.我注意到在线资源经常引用esp和ebp,堆栈和基指针.我写了这个程序:
int comp(int a, int b) {
return a == b;
}
int main() {
int a = 1;
int b = 2;
comp(a, b);
}
Run Code Online (Sandbox Code Playgroud)
在Radare 2中,这反映为:
0x0040050e 55 push rbp
| 0x0040050f 4889e5 mov rbp, rsp
| 0x00400512 4883ec10 sub rsp, 0x10
| 0x00400516 c745f801000. mov dword [rbp-0x8], 0x1
| 0x0040051d c745fc02000. mov dword [rbp-0x4], 0x2
| 0x00400524 8b55fc mov edx, [rbp-0x4]
| 0x00400527 8b45f8 mov eax, [rbp-0x8]
| 0x0040052a 89d6 mov esi, edx
| 0x0040052c 89c7 mov edi, eax
| 0x0040052e e8c3ffffff call sym.comp
| sym.comp(unk)
| 0x00400533 b800000000 mov eax, 0x0
| 0x00400538 c9 leave
\ 0x00400539 c3 ret
Run Code Online (Sandbox Code Playgroud)
为什么使用rbp和rsp?这只是我的编译器喜欢做事的方式吗?另外,为什么rbp-value在堆栈上创建空间,不应该是rbp +值来分配更多空间吗?
Bee*_*ope 11
您正在编译为64位,所以rbp和rsp仅仅是64位等效于32位ebp和esp变量.即使在64位代码中,您经常会看到e**尽可能使用的32位()寄存器 - 但是您不会看到它rsp或rbp通常为1,因为它们保持指针几乎总是需要64位.
由于rbp指向堆栈帧的基础(即函数入口上的堆栈顶部)和x86上的堆栈向下(朝向较低地址),因此将在相对于的负地址处访问本地参数rbp.
1 您可能偶尔会看到ebp在64位代码中使用,但这仅仅是因为编译器已将其从通常的帧指针职责中解除,并且只是将其用作另一个GP寄存器.
| 归档时间: |
|
| 查看次数: |
4590 次 |
| 最近记录: |