汇编指令

源码

编译指令: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       

视频推荐

https://www.bilibili.com/video/BV1Hi4y1s7fr/

posted @ 2020-02-18 13:30  zer0_1s  阅读(264)  评论(0)    收藏  举报