我有一个i386
二进制文件,没有机会执行它。otool -tv
说:
一些功能或方法:
0001a1e0 pushl %ebp ; just prolog
0001a1e1 movl %esp,%ebp ; save old ESP
0001a1e3 pushl %edi ; save EDI, ESI, EBX
0001a1e4 pushl %esi ;
0001a1e5 pushl %ebx ;
0001a1e6 subl $0x4c,%esp ; allocate 0x4c bytes for local puproses
... ; etc
下方的指令
0001a20e leal 0xe0(%ebp),%eax ; load an address into EAX
让我失望了!0xe0(%ebp)
指向哪里?我认为这不是一个局部变量,因为正偏移。我可以在所有的otool
输出中看到这样的访问。如何翻译?
这是对堆栈地址的引用,但您的asm具有误导性(这就是我不喜欢AT&t语法的原因),如果您将leal 0xe0(%ebp),%eax
转换为字节序列,则会得到8D45 E0
,这与LEA EAX,DWORD PTR SS:[EBP-20]
相同。
它要么创建指向本地堆栈缓冲区的指针(由SUB ESP
创建),要么创建指向第7个函数参数的指针,但在没有看到完整代码的情况下,我的赌注是前者。