-
-
[原创]数组越界之入门向
-
发表于: 2018-6-19 23:27 7863
-
做题时候遇到的第一道数组越界的pwn题,其中负数利用有一块地方刚开始一直弄不太明白,发帖求助了一下,在此感谢holing大佬的帮助。
0x1. 堆中的数组越界:
因为堆是我们自己分配的,如果越界,那么会把堆中其他空间的数据给写掉,或读取了其他空间的数据,这样就会导致其他变量的数据变得不对,如果是一个指针的话,那么有可能会引起crash,这里我们主要谈论栈中的数组越界问题。
0x2. 栈中的数组越界:
因为栈是向下增长的,在进入一个函数之前,会先把参数和下一步要执行的指令地址(通过call实现)压栈,在函数的入口会把ebp压栈,并把esp赋值给ebp,在函数返回的时候,将ebp值赋给esp,pop先前栈内的上级函数栈的基地址给ebp,恢复原栈基址,然后把调用函数之前的压入栈的指令地址pop出来(通过ret实现)。
栈是由高往低增长的,而数组的存储是由低位往高位存的,如果越界的话,会把当前函数的ebp和下一跳的指令地址覆盖掉,如果覆盖了当前函数的ebp,那么在恢复的时候esp就不能指向正确的地方,从而导致未可知的情况,如果下一跳的地址也被覆盖掉,那么肯定会导致crash。
以下是我所画的数组元素在栈中的布局:
这样一下看就很明显了,当你把数组的下标越过了最大索引值的时候,所指向的指针就会指向更高地址的栈空间段,所以我们就能够实现任意改写栈空间上的内容,同理,当下标为负数的时候指针会指向更低地址的栈空间段。但是这里就有一个需要注意的地方了,利用负数改写的话我们还能达到“负数变正数”的效果,这一点我们之后会讲到。
在C语言中,整数的基本数据类型分为短整型(short),整型(int),长整型(long),这三个数据类型还分为有符号和无符号,每种数据类型都有各自的大小范围,(因为数据类型的大小范围是编译器决定的,所以之后所述都默认是 64 位下使用 gcc-5.4),如下所示:
了解了数组越界的原理和利用方式之后,我们就来进入实践环节。
check一下:
64位,开了栈保护和nx。
主程序:
漏洞点就出现在数组索引上面,只判断了大于9的情况,没有判断小于0的情况。所以可以利用负数来进行绕过。gdb调试一下,找出数组的栈地址:
0x7fffffffdd80处存储数组下标,0x7fffffffdd88处存储所要赋值给数组的内容。0x7fffffffdd90~0x7fffffffddd8处存储10个数组元素的内容。
再看看hack()函数的ret返回地址:
当我设置下标为1,内容为20的时候,栈中的内容是这样的:
与上面我们所叙述的一样,当我们执行到这段汇编指令的时候:
rax中存储的是索引值,rdx中存储的是内容,[rbp+rax*8-0x60]这一段实质上就是数组元素的偏移寻址,即我们上文所说的十个数组元素的存储地址寻址,rdx赋值给它,那么我们这样就可以利用负数,来修改比数组元素更低地址的空间内容了。
那么这里应该就有疑问了,ret返回地址不是在数组元素地址的更高地址吗?用负数怎么能够达到修改ret地址内容的效果呢?
上面我们已经了解到正负数在计算机中的表示了,为了更容易理解,我们直接实践能很快理解,我们设置下标为-1,内容为20,在栈中的表示是这样的:
可以看见-1表示成了0xffffffffffffffff
。
现在来计算我们所需要输入的下标的值为多少才能覆盖返回地址。
ret地址:[rbp+0x8]
指向内存:[rbp+rax*8-0x60]
所以我们需要做到:(rbp+rax*8-0x60)%0x10000000000000000 == rbp+0x8
,还有一个关键的点是还需要使rax的值为负数,即0x8000000000000000<rax<0xffffffffffffffff
。
这里为什么要取余数呢?因为64位程序中最高是16位(8字节),超出了16位最高位会被截断,所以这里我们可以得到多个可用的rax值。
我们选用0xa00000000000000d来测试一下,转化成负数为-6917529027641081843
。作为下标输入,栈中地址为:
再看看[rbp+rax*8-0x60]地址:
成功任意改变栈地址内容。接下来就好构造了,有十次的机会写栈中的内容,足够了。
因为本身程序中就有system函数存在,所以我们只需要写入/bin/sh
就好了。
这里具体怎么去利用就不细说了,主要讲数组越界利用的这一部分。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- [原创]Tcache利用总结 17417
- [原创]X-NUCA revenge骚思路getshell 10493
- [原创]2018东华杯momo_server详解 12167
- [原创]cve-2010-2883分析 4546
- [原创]hack.lu 2015 bookstore writeup 17060