漏洞发掘 (基础知识)

最常见的两种exploit是:缓冲区溢出,格式化字符串

CPU(Intel,x86)各主要寄存器的一般用途:

寄存器用途
EAX存储器:用于执行计算,并用于存储函数的返回值。基本操作,如加、减、比较的时候使用这个通用寄存器
EBX存储数据
ECX计数器:常用于计数循环的次数。
EDX数据
ESP栈顶指针
EBP基指针(常用来表示一个函数帧的底部)
ESI源操作数指针
EDI目的地址指针
EIP指令指针

注意: 栈是从低地址向高地址,堆是高地址向低地址生长

x86处理器采用的是小端序(低位在前面,例如0x123456->0x563412)

程序存储器分为(按照内存中的顺序排列)

名字类型
text禁用写权限,固定大小
data存储全局变量,静态变量。存储的是已经初始化的,可以改写,固定大小
bss存储全局变量,静态变量。存储的是未初始化的,可以改写,固定大小
heap用于其他的变量(moonife:动态申请的)(比如malloc操作等等,分配的空间在heap里面)。大小可变,对从存储器的低地址向高地址增长
stack大小可变,函数调用时作为中间结果暂存器。存储所有传递的变量,以及函数执行后的EIP的返回地址

函数参数以及局部变量的入栈顺序

void test(int a,int b,int c,int d){
	char flag;
	char buffer[10];
}
void main(){
	test(1,2,3,4);
}
栈顶
buffer低地址
flag
SFP
ret
a/1
b/2
c/3
d/4高地址
栈底

调用的时候4321这样入栈

用户进程空间映像如下图所示:
用户进程空间映像

当函数 Do_Something(param 1)被调用,有以下步骤:

  1. Push param 1
  2. Call Do_Something 的同时 push EIP(返回地址)
  3. Push EBP,这是必须的 ,因为我们需要改变 EBP 的值来引用栈中的值,这是通过 mov ebp,esp
  4. 来实现的,所以栈中的数据,很容易被引用。
  5. 最后,局部变量被压入栈,在我们这个例子是:do_something::buffer[128]。
  6. 因此,当函数结束的时候,将返回main函数。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值