首页
社区
课程
招聘
[分享]整数溢出+数组越界【二进制学习】
发表于: 2018-8-27 16:37 4546

[分享]整数溢出+数组越界【二进制学习】

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


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//