附件是由 ghidra 生成的 x86 二进制文件的反汇编部分。
**************************************************************
* FUNCTION *
**************************************************************
undefined main(undefined1 param_1)
undefined AL:1 <RETURN> XREF[1]: 0804835e(W)
undefined1 Stack[0x4]:1 param_1 XREF[1]: 08048309(*)
undefined4 EAX:4 str_in XREF[1]: 0804835e(W)
undefined4 Stack[0x0]:4 local_res0 XREF[1]: 08048310(R)
undefined4 Stack[-0x10]:4 local_10 XREF[6]: 08048358(R),
08048363(W),
0804836d(R),
08048388(R),
08048393(W),
0804839d(R)
undefined4 Stack[-0x14]:4 local_14 XREF[2]: 0804831a(W),
08048366(R)
undefined4 Stack[-0x18]:4 local_18 XREF[2]: 08048321(W),
08048396(R)
undefined4 Stack[-0x2c]:4 local_2c XREF[3]: 08048369(W),
08048399(W),
080483ac(W)
undefined4 Stack[-0x30]:4 local_30 XREF[12]: 08048328(*),
08048334(*),
08048340(*),
0804834c(*),
0804835b(*),
08048370(*),
0804837c(*),
0804838b(*),
080483a0(*),
080483b4(*),
080483c2(*),
080483d0(*)
main XREF[2]: Entry Point(*),
_start:08048167(*)
08048309 8d 4c 24 04 LEA ECX=>param_1,[ESP + 0x4]
0804830d 83 e4 f0 AND ESP,0xfffffff0
08048310 ff 71 fc PUSH dword ptr [ECX + local_res0]
08048313 55 PUSH EBP
08048314 89 e5 MOV EBP,ESP
08048316 51 PUSH ECX
08048317 83 ec 24 SUB ESP,0x24
0804831a c7 45 f4 MOV dword ptr [EBP + local_14],DAT_080a6b19 = 6Ah j
19 6b 0a 08
08048321 c7 45 f0 MOV dword ptr [EBP + local_18],s_the_ripper_080a6b1e = "the ripper"
1e 6b 0a 08
来自 gdb 的相同代码
0x08048309 <+0>: lea ecx,[esp+0x4]
0x0804830d <+4>: and esp,0xfffffff0
0x08048310 <+7>: push DWORD PTR [ecx-0x4]
0x08048313 <+10>: push ebp
0x08048314 <+11>: mov ebp,esp
0x08048316 <+13>: push ecx
0x08048317 <+14>: sub esp,0x24
=> 0x0804831a <+17>: mov DWORD PTR [ebp-0xc],0x80a6b19
为什么 ghidra 更改[ebp-0xc]
为[EBP + local_14]
. 我发现的类似问题是Ghidra 错误地解释堆栈指针但阅读答案,我没有理解[EBP + local_14]
这里的含义,ghidra 只是重命名-0xc
为一个易于阅读的名称local_14
吗?我不明白如何确切地理解这一点。
在函数头中,显示Stack[-0x10]:4 local_10
. 我认为这意味着local_10
Stack[-0x10] 处是 4 字节变量,其中 Stack 是进入函数时的堆栈指针。但为什么它被添加到 ebp. ghidra 使用的这种表示是什么意思?