我的第一个缓冲区溢出

从一个玩具函数开始:

gets函数:会读取输入的内容直到遇到换行或EOF停止,gets(buffer)而读取到的内容去了buffer数组;

在不进入另一个call的情况下buffer算是临时变量,存在堆栈中 O(∩_∩)O。


这里是一个程序的源代码和汇编代码


保存返回地址

把ebp设为栈基地址,esp为偏移地址

 栈16字节对齐,编译的时候优化的吧  对齐访问效率高一些

给栈分配空间(60个字节)(不清楚是0x60个字节还是0x60+2个字节,如果是0x60的话esp本身指向的额地址不就算是栈外面了)

栈顶空间设置为0(modified为0这个栈顶存放的应该就是modified了,c语言中的int型数据64位系统下,采用64位编译器进行编译处理时,发生变化的变量类型是:long。)

(1c-5c=40十进制64)这句是把buffer复制到eax   这里buffer数组是esp+1C开始向低地址处延伸到esp+5C

把eax复制到esp指向的位置

call  gets

比较0x00和esp+0x5c(modified)

分析到这里就够了,我要做的就是把输入的字符足够多,多到64位填满再多把modified的空间覆盖掉


gdb命令

disas main  执行main函数

r              run

b  *xxxx  下断点

x  $esp+0x5c  查看这个地址的堆栈

ni 单步步过

si 单步步入


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值