源码
编译指令:gcc -code.c -o elf -32 (由源码产生目标文件 -32 为32位程序) 在此即为:gcc -stack.c -o stack elf -32
反汇编
反汇编指令:objdump -d stack -M intel
--disassemble -d 从objfile中反汇编那些特定指令机器码的section
-M intel 显示intel 语法
080483db <fun>:
80483db: 55 push ebp//将ebp压入栈,同时将esp-=4
push ebp 先ESP-=4,将寄存器中(EBP)中的数据送入SS:SP指向的内存单元,esp指向栈顶
80483dc: 89 e5 mov ebp,esp//把esp的值传递给ebp,设置当前ebp
80483de: 83 ec 10 sub esp,0x10//在栈上分配0x10个字节的空间,给<fun>函数开辟空间,范围是(ebp, ebp-0x10)
//下图是开辟新的栈空间:
080483db <fun>:
80483db: 55 push ebp//将ebp压入栈,同时将esp-=4
80483dc: 89 e5 mov ebp,esp//将esp压入栈
80483de: 83 ec 10 sub esp,0x10//在栈上分配0x10个字节的空间
80483e1: c7 45 f8 01 00 00 00 mov DWORD PTR [ebp-0x8],0x1//将0x1存储在[ebp-0x8],dword是双字即四个字节,ptr是指针,这里指[ebp-0x8]地址是一个双字型地址
80483e8: 8b 45 08 mov eax,DWORD PTR [ebp+0x8]//将[esp+0x8]的数据复制到eax
80483eb: 89 45 fc mov DWORD PTR [ebp-0x4],eax//将eax内的数据复制到[ebp-0x4]
80483ee: 8b 55 08 mov edx,DWORD PTR [ebp+0x8]//将[ebp+0x8]内的数据复制到edx
80483f1: 8b 45 0c mov eax,DWORD PTR [ebp+0xc]//将[ebp+0xc]内的数据复制到eax
80483f4: 01 d0 add eax,edx//将edx内的数据与eax内的数据相加,复制到eax
80483f6: c9 leave //等价于mov ebp,esp;pop ebp
80483f7: c3 ret //等价于pop ip;用栈中的数据,修改IP的内容,实现近转移
080483f8 <main>:
80483f8: 55 push ebp
80483f9: 89 e5 mov ebp,esp
80483fb: 6a 14 push 0x14//将0x14=20压入栈
80483fd: 6a 0a push 0xa////将0xa=10压入栈
80483ff: e8 d7 ff ff ff call 80483db <fun>//调用fun函数
8048404: 83 c4 08 add esp,0x8//esp+8,进行栈帧还原
8048407: b8 00 00 00 00 mov eax,0x0//清空eax内的数据
804840c: c9 leave
804840d: c3 ret
804840e: 66 90 xchg ax,ax//交换ax;等价于nop
视频推荐