[分享]整数溢出+数组越界【二进制学习】
1.数组越界
堆中的数组越界: 因为堆是我们自己分配的,如果越界会把堆中其他空间的数据写掉或着读取其他空间的数据。如果是变量则会引起数值改变,如果是指针则可能会引起crash。
栈中的数组越界:因为栈是向下增长的,进入函数前,会把参数和下一条指令地址压栈,如果覆盖了当前函数的ebp(栈底),那么栈还原时esp(栈顶)就不正确指向,从而发送未知错误(大部分是程序崩溃退出),ebp后面的返回地址也被覆盖那么程序执行流程则可被控制。
2.例题实践(栈上溢出):
check文件

64位,开启了栈保护和NX保护
IDA查看主函数unsigned __int64 hacker()
{
signed int j; // [rsp+8h] [rbp-78h]
signed int i; // [rsp+Ch] [rbp-74h]
__int64 v3; // [rsp+10h] [rbp-70h]
__int64 v4; // [rsp+18h] [rbp-68h]
__int64 s[11]; // [rsp+20h] [rbp-60h]
unsigned __int64 v6; // [rsp+78h] [rbp-8h]
v6 = __readfsqword(0x28u);
puts("Welcome to hacker's system\n");
puts("Now you can set hackers' age\n");
memset(s, 0, 0x50uLL);
for ( i = 0; i <= 9; ++i )
{
puts("Enter hacker index:");
__isoc99_scanf("%lld", &v3);
puts("Enter hacker age:");
__isoc99_scanf("%lld", &v4);
if ( v3 > 9 ) #漏洞点 索引只判断了大于9的情况没有判断小于0的情况,所以利用负数可以绕过。
exit(0);
s[v3] = v4;
}
puts("Now let's see your creation:'");
for ( j = 0; j <= 9; ++j )
printf("%lld ", s[j]);
return __readfsqword(0x28u) ^ v6;
}
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
复制成功
