关于缓冲区到函数返回地址分析

用gdb调试可执行程序h(从附件下载h.tar.gz),计算缓冲区起始地址与函数foo返回地址的距离。调试过程

一,基本原理:
设置断点表示将要执行的下一条指令 此时eip将会指向断点处的指令

gdb调试中设置断点表示即将进入下一条的指令为断点处,即eip指向breakpoint处
strcpy(buffer,Lbuffer)表示从右至左压入栈中所以Lbuffer会在高地址处
在函数调用时会先压入返回地址,作业中也即在调用设置断点处的寄存器中的值,所以foo返回地址的值也即是在设置断点*(foo+0)之前在foo栈帧内压入 下图中设置为$1; 或者在进入foo栈后获取ebp的值利用ebp+4的值也即是foo返回地址
在调用strcpy函数时foo会将参数从右到左压入栈中,此时设置断点在调用strcpy后buffer下降设置成返回地址

二,主要步骤
1.反汇编两个函数:

2.获得调用前的值esp

3.获得buffer地址并计算距离

附:验证栈帧结构

三,使用到的基本gdb调试命令
1.进入gdb调试
gdb ./h
2.设置断点
b *(foo+0)
b *(foo+21)
b *(foo+27)
3.运行
r
4.查看寄存器
i r
5.查看内容
x/x $esp
x/wx 0x0804****
x/4wx ** 显示4个
6.退出
ctrl+z
YC,Ustc
附件地址:http://pan.baidu.com/s/1dDs6MNv

你可能感兴趣的:(缓冲区,GDB调试,地址距离计算)