由一个简单的程序学习常见汇编指令

前言

一直以来,内心有股焦急焦虑,急冲冲的学习,急冲冲的比赛,没有时间和心思回过头来静心总结。
突然之间想安静下来回顾和记录一下pwn的知识点 其实是写web有点累了,想切换一下脑壳,看心情更新吧

程序


编译

1
gcc stack.c -o stack -m32

反汇编分析

1
objdump -d stack -M intel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
080483db <fun>:
80483db: 55 push ebp//将ebp压入栈
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

常见汇编指令

1、寄存器


2、常见汇编指令

下期预告

可能写如何编写一个简单的汇编程序、可能写函数在栈中的调用过程、ret指令与call指令的深入理解、可能写程序在内存中的分布、编译链接过程、可能写函数调用约定、x86架构与x64架构的不同之处。
个人感觉这些都是pwn的基础内容。建议如果想深入学习pwn的话,推荐首先学习《汇编语言(第3版)》。