Chybeta

一次水水的调试

Linux 作业…

编译

1
gcc -g -O0 array.c main.c -o test

调试

1
gdb test

通过list命令,可以显示出部分源代码,我们选择在源代码的第9行处下断点。

通过print命令,可以查看变量的值,因为数组名已知,可以如下打印出数组的内容。可以发现,在还没有初始化或者赋值前,数组内容是随机化(或者说是垃圾数据)。

此时程序运行到第9行附近,可以再次通过list命令显示其附近的源代码。

这里为了方便,我们在第11,12,15行下下断点,分别对应两个array_fill_with() 函数 和 array_add()函数。

接下来单步调试,命令是

1
gdb-peda$ n

此时在执行完第11行的array_fill_with(),即已经完成了对数组vector_a的赋值后,我们查看下三个数组的值。

数组vector_a全被赋值为10在意料之中(0xa == 10 ),但注意数组vector_b的第一个元素也被赋值为0xa了。在前面可知,数组vector_b的第一个元素原本是0xff00。所以这边可能产生了一个越界。

下一条语句是对数组vector_b进行赋值,这次我们选择进入函数array_fill_with(),即进行step into,gdb中相应的命令为:

1
gdb-peda$ s

由上图,通过list命令,可知我们已经进入到了array.c中的第七行,正在进行一个循环。其中变量length的值为0x10,即为16。

我们知道,在C语言中,数组下标是从0开始的,这里也就解释了为什么我们再对数组vector_a赋值完后,数组vector_b的第一个元素也被改变了。

接下来我们继续运行程序,命令为:

1
gdb-peda$ c

此时,已经完成了对数组vector_b的赋值,我们可以推测数组vector_c的第一个元素也会被从原先的 0x0 改为 0x37。事实证明,推测是正确的,见下图:

Bug

其实重点就一个,C语言中数组下标从0开始的。
array.c中的i <= length 改为 i < length就ok啦。

微信扫码加入知识星球【漏洞百出】
chybeta WeChat Pay

点击图片放大,扫码知识星球【漏洞百出】