逆向-数组-缓冲区溢出的解析
程序如下,由滴水逆向的老师提供:
#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,最后看见关键的:
进而最后程序出错,无法停止
[Sign]做不出ctf题的时候很痛苦,你只能眼睁睁看着其他人领先你