只溢出一个字节,比如定义的数组是 a[4],在操作的时候却操作 a[4],实际上数组最大是到 a[3] 的
1、溢出字节为可控制任意字节:通过修改大小造成块结构之间出现重叠,从而泄露其他块数据,或是覆盖其他块数据。
可以看下面源码,他 for(i=0;i<=size;i++) 里面那个 i<=size 是有问题的,这样会多循环一次
首先 b *main
下个断点,然后运行到第六行也就是等待输入的那块
p ptr
看一下 ptr 指向的是哪一个地址
x/10gx 0x602010-0x10
然后查看一下那一块的内存,减去 0x10 是因为 chunk 前面要记录一些信息,比如前 0x8 如果前一个是空闲的话就记录前一个 chunk 的大小,否则就给前一个用来存数据。后面 0x8 记录的分别是该 chunk 的大小和 A、M、P 标志位
A(NON_MAIN_ARENA)表示 chunk 属于主分配区(1)或者非主分配区(0)
M(IS_MAPPED)表示当前 chunk 是否是由 mmap 分配的,M 为 1 表示该 chunk 是从 mmap 映射区域分配的,否则是从 heap 区域分配的
P(PREV_INUSE)表示前一个 chunk 有 (1) 没有 (0) 被使用,一般来说第一个被分配的 chunk 的这个位会标记为 1,来防止访问到非法内存
然后再运行的话就要接收我们的输入了,我们输入 17 个字符,以为前面源码中写的 my_gets(chunk1,16);
是 16 个,可以看到把第二个 chunk 的低一字节改成了 0x41
strlen 在计算长度的时候不会把结束符 '\x00' 计算在内,strcpy 在拷贝的时候会把 '\x00' 也算上,所以就会造成 off by one
先 b *main 上下个断点,然后运行到输入的那个位置,在这之前先看一下 chunk 的情况
输入 24 个 A,等他拷贝完之后,再看一下会发现原本的那低一字节已经被写成 \x00 了
首先看一下 create a book 功能:
首先要输一下书名的大小,然后会申请这么大的空间,然后通过 sub_9f5 这个函数往这个空间输入书名
这个函数的定义有问题,他会多置一个 0
传入的两个参数分别对应上面的 ptr 和 v1-1,地址和大小
如果我们输入的长度跟之前设定的长度一样的话,因为有个 ++buf,所以 break 之后会多写一个 0
我们再来看一下定义的 book 的结构体
首先输入作者的名字 32 字节,他会多输一个 \x00,然后被后面的 book 的一系列指针给覆盖掉
然后当输出 author 的时候就会把覆盖掉的哪一项给输出来
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-11-27 16:45
被yichen115编辑
,原因: 上传附件