我有一个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
输出中看到这种访问。如何翻译?
答案 0 :(得分:3)
这是对堆栈地址的引用,但是你的asm有误导性(这就是为什么我不喜欢AT& T语法),如果你将leal 0xe0(%ebp),%eax
转换为字节序列,你将获得{{ 1}},与8D45 E0
相同。
它要么创建指向本地堆栈缓冲区的指针(由LEA EAX,DWORD PTR SS:[EBP-20]
创建),要么创建指向第7个函数参数的指针,但是没有看到完整的代码,我的赌注就是前者。