【投票】下面这个方法可以调用执行吗?

7 条回复
66 次浏览


上图的程序 getme 方法可以调用执行吗?
给出你的理由。

投票

图中的get方法可以调用执行吗?

可以
不可以

选择一项进行投票,无截止时间。

讲故事的人
OP
Guardian
红队

那么执行结果应该是 Your ID is:和 Please 这两行对吧。doge

前排打手
红队

我的 C 水平 是不能额, 没有调用

Ai 水平 非常像一个**缓冲区溢出(Buffer Overflow)**的实验案例。
char id[20];
scanf("%s", &id);

讲故事的人
OP
Guardian
红队

@jolon @libra2 经过我的最终投票后,平票揭晓答案,图中程序是一个典型的输入内容长度未控制(很多系统漏洞、二进制漏洞都能看到这个说法),导致缓冲区溢出,严重的可以导致任意命令执行。
原理是利用溢出内容覆盖某函数的返回方法地址(函数返回方法存储的寄存器),函数执行完毕时会调用返回,将 print 方法的返回地址覆盖为 getme 的入口地址,就实现了调用 getme 方法。
又称:缓冲区溢出漏洞
首先要得到 getme 的入口地址,这个涉及到 PE 文件结构和操作系统原理。
image
使用分析工具分析内存偏移量(都是可以计算出来的)
虽然定义 id 变量长度为 20,但是 scanf 是一个不安全的方法,可以一直读取,输入到 40 个字符的时候,缓冲区溢出,堆栈到了 ESP 区域,后面是 getme 的入口内存偏移地址,写入到 print 方法的返回地址。
那么就调用了 getme 方法。
image
缓冲区填充和栈的生长示意图

发表一个评论

R保持