# X86 架构介绍
必须理解软件是如何在 CPU 执行的
X86 架构实现了 push
和 pop
对低地址的 stack 进行操作。
函数 return 机制,return 的 address 也存储在 stack 中
CPU 寄存器的 32 位指令。 EAX
和 AX
通用寄存器: EAX
、 EBX
、 ECX
、 EDX
、 ESI
、 EDI
寄存器 | 作用 |
---|---|
EAX | 通用寄存器,用于存放函数返回值和算术运算结果 |
EBX | 通用寄存器,通常用于基址寄存器,存放数据指针 |
ECX | 通用寄存器,通常用于计数器,循环计数等 |
EDX | 通用寄存器,用于存放 I/O 端口地址和部分算术运算结果 |
ESI | 通用寄存器,用于源数据指针 |
EDI | 通用寄存器,用于目的数据指针 |
以下是 ESP
、 EBP
和 EIP
寄存器的作用:
寄存器 | 作用 |
---|---|
ESP | 栈指针寄存器,用于指向栈顶,在函数调用和处理中用于管理栈上的数据 |
EBP | 基址指针寄存器,通常用于指向当前函数的栈帧基址,在函数内部用于访问局部变量和参数 |
EIP | 指令指针寄存器,用于存放下一条要执行的指令的地址,控制程序的执行流程 |
这些寄存器在汇编语言和低级编程中扮演着重要的角色,特别是在函数调用、栈操作和控制流程方面。
EIP 被覆盖比较常见,通常会控制输入覆盖掉 EIP,将程序指向 payload
使用 immunity debugger
进行调试。
# 举例
他这里演示了一下缓冲区溢出,我简单品鉴一下
他写了一个程序,将接收一个参数,随后退出。
接收的参数在 stack 的顶部位置,是提前声明好的大小。如果没有进行边界检查,这个可以通过输入超出声明大小的数据,从栈顶向栈底写入,直到超出声明的大小,还继续写。覆盖代码部分、直到覆盖返回地址。这个时候执行最后一步返回操作的时候就会跳转到通过输入指定的地址中。从而执行 payload!