逆向-数组-缓冲区溢出的解析

程序如下,由滴水逆向的老师提供:

#include <windows.h>
#include <stdio.h>
void Fun()
{
    while(1)
    {
        printf("你好\n");
    }
}
int check()
{
    int arr[8];
    arr[9]=(int)&Fun;
    return 0;
}
int main()
{
    check();
    getchar();
    return;
}

暑假好好复习了数据结构和汇编,学了点逆向再来看这个题目

 

1.首先数组是可以越界访问的,arr[9]不会报错

2.每次执行函数,会提升堆栈,把变量存入提升的堆栈中

3.但是如果存储内容溢出了提升的堆栈,会覆盖下面的值,即存储的EBP指针的原来地址等内容

4.程序结束时,进行堆栈平衡,导致返回地址出错,返回其他指令的地址,执行其他命令

 

以上大致就是缓冲区溢出的原理。

 

查看汇编代码:

中间一堆jmp,最后看见关键的:

进而最后程序出错,无法停止

 

posted @ 2020-08-24 22:25  ch0bits  阅读(308)  评论(0编辑  收藏  举报