OP
Guardian
那么执行结果应该是 Your ID is:和 Please 这两行对吧。
那么执行结果应该是 Your ID is:和 Please 这两行对吧。
还有没有投票的,再来几个揭晓答案。
@jolon @libra2 经过我的最终投票后,平票揭晓答案,图中程序是一个典型的输入内容长度未控制(很多系统漏洞、二进制漏洞都能看到这个说法),导致缓冲区溢出,严重的可以导致任意命令执行。
原理是利用溢出内容覆盖某函数的返回方法地址(函数返回方法存储的寄存器),函数执行完毕时会调用返回,将 print 方法的返回地址覆盖为 getme 的入口地址,就实现了调用 getme 方法。
又称:缓冲区溢出漏洞
首先要得到 getme 的入口地址,这个涉及到 PE 文件结构和操作系统原理。

使用分析工具分析内存偏移量(都是可以计算出来的)
虽然定义 id 变量长度为 20,但是 scanf 是一个不安全的方法,可以一直读取,输入到 40 个字符的时候,缓冲区溢出,堆栈到了 ESP 区域,后面是 getme 的入口内存偏移地址,写入到 print 方法的返回地址。
那么就调用了 getme 方法。

缓冲区填充和栈的生长示意图
应该是不会把,没有明确的调用