Geo*_*rge 3 c x86 assembly ollydbg
以下代码
int _main() {return 0;}
Run Code Online (Sandbox Code Playgroud)
使用命令编译:
gcc -s -nostdlib -nostartfiles 01-simple.c -o01-simple.exe
Run Code Online (Sandbox Code Playgroud)
gcc版本4.4.1(TDM-1 mingw32)
OllyDbg产生了这个输出:
你能解释一下这里发生的事吗?分析到目前为止:
// these two seems to be an idiom:
PUSH EBP // places EBP on stack
MOV EBP, ESP // overwrites EBP with ESP
MOV EAX, 0 // EAX = 0
LEAVE // == mov esp, ebp
// pop ebp
// according to
// http://en.wikipedia.org/wiki/X86_instruction_listings
Run Code Online (Sandbox Code Playgroud)
这一切是什么意思?
这会创建一个堆栈框架.
PUSH EBP
MOV EBP, ESP
Run Code Online (Sandbox Code Playgroud)
在使用的调用约定中,返回值是通过EAX
(0
因为你写的return 0;
- 请尝试将其更改为return 1;
并查看它如何影响代码)发送回来的.
MOV EAX, 0
Run Code Online (Sandbox Code Playgroud)
这告诉处理器清理堆栈帧(它的MOV ESP, EBP
后面POP EBP
是与创建堆栈帧时相反的内容):
LEAVE
Run Code Online (Sandbox Code Playgroud)