欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

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

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

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。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功