-
-
[分享]整数溢出+数组越界【二进制学习】
-
发表于: 2018-8-27 16:37 4546
-
1.数组越界
堆中的数组越界: 因为堆是我们自己分配的,如果越界会把堆中其他空间的数据写掉或着读取其他空间的数据。如果是变量则会引起数值改变,如果是指针则可能会引起crash。
栈中的数组越界:因为栈是向下增长的,进入函数前,会把参数和下一条指令地址压栈,如果覆盖了当前函数的ebp(栈底),那么栈还原时esp(栈顶)就不正确指向,从而发送未知错误(大部分是程序崩溃退出),ebp后面的返回地址也被覆盖那么程序执行流程则可被控制。
2.例题实践(栈上溢出):
check文件
64位,开启了栈保护和NX保护
计算覆盖返回值的偏移 E88 - E20 = 68 ---> Dh
前面的整数溢出知识可以绕过组数下标判断,观察汇编:
rax---> 数组下标
rdx---> 输入的变量
[rbp + rax *8 +s],rdx 是数组寻址方式。
这里可以控制rax的值,而 rax的范围是 ---> 0x8000000000000000<rax<0xffffffffffffffff
因为64位最高位是16位多出的部分会被截断所以rax可以有多个值本文选用0xA00000000000000D变量
有任意地址写的能力,接下来就需要堆栈内数据布局了。
因为文件有system函数,所以我们只需要输入/bin/sh就能得到shell。
通过scanf函数将输入的/bin/sh写到bss段上,控制跳转到system执行即可拿到shell。
那么堆栈内布局文字说明如下:
1.ret返回地址0x400A33
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: